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

问题描述 投票:61回答:6

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

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

谢谢! :)

c++ string null
6个回答
70
投票

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

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

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

版画

5 5

如果空字符对字符串有特殊含义,那么就不会像5 1那样。


42
投票

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

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


4
投票

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

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

有几点需要注意:

  • temp.size()将返回从第一个h到最后p的字符数
  • 但与此同时,temp.c_str()temp.data()将返回null终结者
  • 或者换句话说int(temp[temp.size()])将为零

我知道,我听起来类似于这里的一些答案,但我想指出sizestd::stringC++是单独维护的,它不像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

参考文献:


2
投票

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

但是,存储在对象temp中的实际数据可能不会以空值终止,但它并不重要,对程序员来说无关紧要,因为当程序员想要const char*时,他会在对象上调用c_str(),这是有保证的返回以null结尾的字符串。


1
投票

使用C ++字符串,您不必担心这一点,并且可能取决于实现。

使用temp.c_str()你得到一个字符串的C表示,它肯定会包含\0字符。除此之外,我真的不知道它对C ++字符串有什么用处


1
投票

std::string内部保留了字符数。在内部,它使用此计数。就像其他人所说的那样,当你需要显示字符串或任何原因时,你可以使用它的c_str()方法,它会在最后给你带有null终结符的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.