下面的字符串是否包含空终止符 '\0'?
'\0'
std::string temp = "hello whats up";
不,但是如果您说 temp.c_str(),那么从这个方法返回的结果中将包含一个空终止符。
temp.c_str()
值得一提的是,您可以像其他字符一样在字符串中包含空字符。
string s("hello"); cout << s.size() << ' '; s[1] = '\0'; cout << s.size() << '\n';
指纹
5 5
而不是如果 null 字符对字符串有特殊含义所期望的 5 1。
5 1
是的,如果您调用 temp.c_str(),那么它将返回以 null 结尾的 c-string。
然而,存储在对象 temp中的实际数据可能不是以 null 结尾的,但是对于程序员来说没有关系,也不应该有关系,因为当程序员需要 const char*时,他会在对象上调用 c_str(),这保证返回空终止字符串。
temp
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'。
mystring.c_str()
mystring.data()
&mystring[0]
mystring[mystring.size()]
在 C + + 17和更高版本中,mystring.data()还提供了一个重载,它返回指向字符串内容的非常数指针,而 mystring.c_str()只提供了一个 const限定的指针。
const
对于 C + + 字符串,您不必担心这个问题,而且它可能取决于实现。
使用 temp.c_str()可以得到字符串的 C 表示形式,它肯定包含 \0字符。除此之外,我看不出它对 C + + 字符串有什么用
\0
std::string在内部保存字符数的计数。在内部它使用这个计数工作。正如其他人所说,当你需要字符串显示或其他原因,你可以它的 c_str()方法,将给你的字符串与空终止符结束。
std::string
这取决于你对“包含”的定义
几乎没有什么值得注意的:
temp.size()
h
p
temp.data()
null
int(temp[temp.size()])
我知道,我听起来和这里的一些答案很相似,但是我想指出的是,C++中 std::string的 size是 C中的 分开维持,而不是像,除非你找到第一个 null终止符,否则你要一直数下去。
C++
size
C
另外,如果您的 string literal包含嵌入式 \0,那么情况就会有所不同。在这种情况下,std::string的构造在第一个 null字符处停止,如下所示:
string literal
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
参考文献: