私はその明確にするため、この記述を好き:
ヌルで終了する配列 (つまりC文字列)を含む配列へのポインタを返します。 文字列オブジェクトの現在の値を表します。この配列には、文字列オブジェクトの値を構成する文字の同じシーケンス と最後にnull文字( '\ 0')を付加する が含まれています。
ただし、この機能の目的に関するいくつかの点はまだ不明です。
あなたはc_str
を呼び出すと、ホストオブジェクト(std::string
)の内部char配列に格納された文字列の末尾に\0
文字を追加するかもしれないと思っために許されることができます:
s[s.size+1] = '\0'
しかし、それはそうですstd::string
オブジェクトはヌルでもc_str
を呼び出す前に、デフォルトで終端されている:
定義を見た後:
const _Elem *c_str() const _NOEXCEPT
{ // return pointer to null-terminated nonmutable array
return (this->_Myptr());
}
文字配列の末尾に\0
を追加するコードはありません。限り、私はc_str
ちょうどbegin()
のような配列の最初の要素に格納されているcharへのポインタを返すと言うことができます。私は、内部配列が終了していることをチェックするコードも見ていません。\0
何か不足していますか?
C++ 2003 StandardとC++ 2011 Standardの違いを見逃しました。クラスstd :: stringのC++ 2011 Standardオブジェクトの前に、終了ゼロのない文字列を格納することができます。 –
1.文字列が作成または変更されている間に自動的にゼロが追加されます。 2.文字列定数 "123456789"は常にASCIIZで、末尾にゼロの文字があります。 –
明らかに、関数 'c_str()'は、呼び出されるたびに配列の最後に0を付加しません。新しい配列を割り当てる必要があり、呼び出し元(おそらくあなた)は毎回それを割り当てなくてはなりません時間と再び... –