以下の文字列にはヌルターミネータ「\ 0」が含まれますか?
std::string temp = "hello whats up";
ありがとう! :)
いいえ。ただし、temp.c_str()
と言うと、このメソッドからの戻り値にヌルターミネータが含まれます。
他の文字と同じように、文字列にヌル文字を含めることができることも言う価値があります。
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
プリント
5 5
5 1
ではなく、null文字が文字列に対して特別な意味を持っている場合に予想されるかもしれません。
C++ 03ではなく、C++ std :: stringがメモリ内で連続していることはC++ 11より前では保証されていません。 C文字列(文字列を格納するためのchar配列)のみにnullターミネータがありました。
C++ 11以降では、mystring.c_str()
はmystring.data()
と同等であり、&mystring[0]
と同等です。また、mystring[mystring.size()]
は'\0'
であることが保証されています。
これは、ここでの「含む」の定義に依存します。に
_std::string temp = "hello whats up";
_
注意すべきことがいくつかあります。
temp.size()
は、最初のh
から最後のp
までの文字数を返しますtemp.c_str()
またはtemp.data()
はnull
ターミネーターを返しますint(temp[temp.size()])
はzeroになります私は知っている、私はここでいくつかの答えに似ているように聞こえますが、_std::string
_の_C++
_のsize
は個別に維持され、最初のC
ターミネータが見つからない限り、カウントを続けるnull
のとは異なります。
加えて、_string literal
_に_\0
_が埋め込まれている場合、ストーリーは少し異なります。この場合、_std::string
_の構築は、次のように最初のnull
文字で停止します。
_std::string s1 = "ab\0\0cd"; // s1 contains "ab", using string literal
std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd", using different ctr
std::string s3 = "ab\0\0cd"s; // s3 contains "ab\0\0cd", using ""s operator
_
参照:
C++文字列を使用すると、そのことを心配する必要はなく、実装に依存する可能性があります。
temp.c_str()
を使用すると、文字列のC表現を取得できます。これには、間違いなく\0
char。それ以外は、C++文字列でどのように役立つか本当にわかりません
_std::string
_は、文字数のカウントを内部的に保持します。内部的には、このカウントを使用して機能します。他の人が言ったように、表示または何らかの理由で文字列が必要な場合は、c_str()
メソッドを使用して、文字列の末尾にヌルターミネータを付けることができます。