字符串是否有空终止符?

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

std::string temp = "hello whats up";
99276 次浏览

不,但是如果您说 temp.c_str(),那么从这个方法返回的结果中将包含一个空终止符。

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

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

指纹

5 5

而不是如果 null 字符对字符串有特殊含义所期望的 5 1

是的,如果您调用 temp.c_str(),那么它将返回以 null 结尾的 c-string。

然而,存储在对象 temp中的实际数据可能不是以 null 结尾的,但是对于程序员来说没有关系,也不应该有关系,因为当程序员需要 const char*时,他会在对象上调用 c_str(),这保证返回空终止字符串。

在 C + + 03中没有,在 C + + 11之前甚至不能保证 C + + std: : string 在内存中是连续的。只有 C 字符串(用于存储字符串的 char 数组)具有 null 结束符。

在 C + + 11及更高版本中,mystring.c_str()等于 mystring.data()等于 &mystring[0],而 mystring[mystring.size()]保证是 '\0'

在 C + + 17和更高版本中,mystring.data()还提供了一个重载,它返回指向字符串内容的非常数指针,而 mystring.c_str()只提供了一个 const限定的指针。

对于 C + + 字符串,您不必担心这个问题,而且它可能取决于实现。

使用 temp.c_str()可以得到字符串的 C 表示形式,它肯定包含 \0字符。除此之外,我看不出它对 C + + 字符串有什么用

std::string在内部保存字符数的计数。在内部它使用这个计数工作。正如其他人所说,当你需要字符串显示或其他原因,你可以它的 c_str()方法,将给你的字符串与空终止符结束。

这取决于你对“包含”的定义

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

几乎没有什么值得注意的:

  • temp.size()将返回从第一个 h到最后一个 p的字符数(两者都包括在内)
  • But at the same time temp.c_str() or temp.data() will return with a null terminator
  • 或者换句话说,int(temp[temp.size()])将是

我知道,我听起来和这里的一些答案很相似,但是我想指出的是,C++std::stringsizeC中的 分开维持,而不是像,除非你找到第一个 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

参考文献: