std :: string是否包含null终止符?

mis*_*ter 66 c++ string null

下面的字符串是否包含空终止符'\ 0'?

std::string temp = "hello whats up";
Run Code Online (Sandbox Code Playgroud)

谢谢!:)

jah*_*haj 77

不,但是如果你说temp.c_str()一个null终止符将包含在这个方法的返回中.

值得一提的是,您可以在字符串中包含空字符,就像任何其他字符一样.

string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
Run Code Online (Sandbox Code Playgroud)

版画

5 5

5 1如果空字符对字符串有特殊含义,则不会如此期望.

  • 实际上,从 C++11 开始,`std::string` 保证以 null 终止。具体来说,“s[s.size()]”将始终为“\0”。 (5认同)
  • 如果你调用`temp.c_str()`,将包含空字符.如果你真的需要它在字符串中,只需像任何其他字符一样添加它.`temp.push_back( '\ 0')`.现在`temp.c_str()`将包含*两个*null字符. (4认同)
  • @dupdupdup,正如一些回复所提到的,如果您需要一个以 null 结尾的字符串,您应该在构造的对象上调用 s.c_str() 。它将返回一个指向字符数组的指针,保证末尾有'\0'。 (2认同)

小智 48

不是在C++ 03中,在C++ 11之前甚至不能保证C++ std :: string在内存中是连续的.只有C字符串(用于存储字符串的字符数组)具有空终止符.

在C++ 11以后,mystring.c_str()就相当于mystring.data()等效于&mystring[0],并mystring[mystring.size()]保证是'\0'.

  • @ H2CO3:老实说,如果冒犯了你,你需要更厚的皮肤. (6认同)
  • 使用C++ 11,现在可以保证字符串在内存中是连续的. (4认同)
  • @ H2CO3:除了C++ 11之外,_2005_ [DR 530](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530)对此进行了论述.绝大多数标准库实现已将字符串数据存储在连续内存中至少一段时间. (4认同)
  • 谢谢@ildjarn,我正在寻找那个.此举的部分原因是委员会中没有人知道不使用连续内存的STL实现. (3认同)

ani*_*b10 5

这取决于您对“包含”的定义。在

std::string temp = "hello whats up";
Run Code Online (Sandbox Code Playgroud)

有几件事要注意:

  • temp.size()将先返回字符数h去年p
  • 但同时temp.c_str()还是temp.data()会带null终止符返回
  • 否则int(temp[temp.size()])为零

我知道,我的声音有些类似于此的答案,但我想指出的是,sizestd::stringC++单独保存,它不是像C哪里你保持,除非你找到的第一个计数null终止。

另外,如果您的string literal内容包含Embedded ,则故事会有所不同\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
Run Code Online (Sandbox Code Playgroud)

参考文献: