以下の文字列には null ターミネータが含まれます'\0'か?
std::string temp = "hello whats up";
いいえ、ただしtemp.c_str()、null ターミネータがこのメソッドからの戻り値に含まれると言う場合。
また、他の文字と同様に、文字列にヌル文字を含めることができることにも注意してください。
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
版画
5 5
5 1ヌル文字が文字列に対して特別な意味を持っていた場合、期待するほどではありません。
C++03 にはありません。C++11 より前では、C++ std::string がメモリ内で連続していることさえ保証されていません。C 文字列 (文字列を格納するための char 配列) のみがヌル ターミネータを持っていました。
C++11 以降でmystring.c_str()は、 は と同等mystring.data()で&mystring[0]あり、 でmystring[mystring.size()]あることが保証されています'\0'。
C++17 以降でmystring.data()は、文字列の内容への非 const ポインターを返すオーバーロードも提供しますが、 -qualified ポインターmystring.c_str()のみを提供します。const
はい、 を呼び出すとtemp.c_str()、null で終わる c-string が返されます。
ただし、オブジェクトに格納されている実際のデータはnull で終了していない可能性がありますtempが、それは問題ではなく、プログラマーにとっては重要ではありません。 -終了文字列。const char*c_str()
C++ 文字列を使用すると、それについて心配する必要はありません。実装に依存している可能性があります。
を使用temp.c_str()すると、文字列が確実に含まれる文字列の C 表現が得られます\0。それ以外は、C ++文字列でどのように役立つかはわかりません
std::string文字数のカウントを内部的に保持します。内部的には、このカウントを使用して動作します。他の人が言ったように、表示または何らかの理由で文字列が必要な場合はc_str()、最後にnullターミネータを持つ文字列を提供するメソッドを使用できます。