2012-10-02 4 views
8

可能性の重複:
string c_str() vs. data()std :: string :: c_str()は常にNULLで終了する文字列を返しますか?

私はCを作るためにstd::stringchar[32]に変換するstrncpy(dest, src_string, 32)を使っ++のクラスは、レガシーCコードで動作します。しかし、std :: stringのc_str()メソッドは常にヌルで終了する文字列を返しますか?

+3

はい、しかし、あなたの 'strncpy'が小さすぎる場合は、それを上にコピーすることはできません。あなたのヌルターミネータがインデックス40にあり、32以上しかコピーしていないとします。もはやnullは終了しません。 –

+1

'c_str()'は、Cで定義されたC文字列を返します。私たちがここでやるべきことは、このサイトに実際には収まらない「Cストリング」が何を意味するのかを説明することなので、これは本当の質問ではありません。 – Griwes

+0

@Griwes私はこれをNARQとして閉じなければならないとは思わない、RTFMは閉じるより適切な理由だろう:) – Praetorian

答えて

20

std :: stringのc_str()メソッドは、常にヌルで終了する文字列を返しますか?

はい。

それの仕様は次のとおりです。

戻り値:[0,size()]の各iためのポインタpようp + i == &operator[](i)

iに指定した範囲が閉じられていることに注意してください、そのようsize()は、文字列の最後までの文字を参照すると、有効な指標です。

operator[]は、このように指定されている:

戻り値:*(begin() + pos)pos < size()場合、値の別名であるstd::stringの場合、charT()

有するタイプTのオブジェクトへの参照を、さもなければstd::basic_string<char>となるので、charTcharであり、値構成charの値は0です。したがって、std::string::c_str()の結果が指す文字配列はゼロ終了します。

+1

埋め込まれたNULがあるかもしれないことに言及する価値があるようだ。つまり、str.push_back(0);を実行するだけで、NUL文字を含むstd :: stringを構築することは可能です。これはstr :: stringを使用する利点ですが、頭に入れておく必要があります。 また、std :: stringに埋め込みNULが含まれていて、std :: stringの多くの用途ではこのようなことは起こりません。魔法のように表示されることはありません。だから、それだけに気をつけてください。 –

1

thisによれば、答えはイエスです。

+1

やあ、私はいつもそのサイトを使用しています、なぜそれは悪いですか? –

+8

@ nightcracker:批判のように、下品な言葉は不要です。ええ、cplusplus.comにはエラーと「meh」の例がありますが、何らかの理由で「ああこれは私のチャンスだから、妥当な批判を超えて何かを憎んでいる」それを切り抜こう。私は個人的に検索エンジンを介して、迅速な参照のためにそこに行く。また、すべての回答が標準的な見積もりを必要とするわけではありません。 – GManNickG

+1

@Griwes:確かに;出版の歴史の中のどの出版物と同じように、あなたが一生懸命見ていると、誤った言葉や貧しい言葉の選択を見つけることは可能です。その特定の騒ぎの中の重要なものは、ずっと前に修正されています。 –

11

c_strは "C文字列"を返します。また、C文字列は常にヌル文字で終了します。これはCの標準です。

Null terminating strings.

関連する問題