web-dev-qa-db-ja.com

std :: stringにはヌルターミネータが含まれていますか?

以下の文字列にはヌルターミネータ「\ 0」が含まれますか?

std::string temp = "hello whats up";

ありがとう! :)

63
mister

いいえ。ただし、temp.c_str()と言うと、このメソッドからの戻り値にヌルターミネータが含まれます。

他の文字と同じように、文字列にヌル文字を含めることができることも言う価値があります。

string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';

プリント

5 5

5 1ではなく、null文字が文字列に対して特別な意味を持っている場合に予想されるかもしれません。

74
jahhaj

C++ 03ではなく、C++ std :: stringがメモリ内で連続していることはC++ 11より前では保証されていません。 C文字列(文字列を格納するためのchar配列)のみにnullターミネータがありました。

C++ 11以降では、mystring.c_str()mystring.data()と同等であり、&mystring[0]と同等です。また、mystring[mystring.size()]'\0'であることが保証されています。

47
user529758

これは、ここでの「含む」の定義に依存します。に

_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
_

参照:

5
aniliitb10

C++文字列を使用すると、そのことを心配する必要はなく、実装に依存する可能性があります。

temp.c_str()を使用すると、文字列のC表現を取得できます。これには、間違いなく\0 char。それ以外は、C++文字列でどのように役立つか本当にわかりません

1
Naps62

_std::string_は、文字数のカウントを内部的に保持します。内部的には、このカウントを使用して機能します。他の人が言ったように、表示または何らかの理由で文字列が必要な場合は、c_str()メソッドを使用して、文字列の末尾にヌルターミネータを付けることができます。

1
Superman