下面的字符串是否包含空终止符'\0'
?
std::string temp = "hello whats up";
不,但是如果您说temp.c_str()
此方法的返回中将包含一个空终止符。
值得一提的是,您可以像任何其他字符一样在字符串中包含空字符。
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
印刷
5 5
如果空字符对字符串有特殊含义,则不像5 1
您所期望的那样。
不在 C++03 中,在 C++11 之前甚至不能保证在 C++ 中 std::string 在内存中是连续的。只有 C 字符串(用于存储字符串的字符数组)具有空终止符。
在 C++11 及更高版本中,mystring.c_str()
等价于mystring.data()
等价于&mystring[0]
,并mystring[mystring.size()]
保证为'\0'
。
在 C++17 及更高版本中,mystring.data()
还提供了一个重载,它返回一个指向字符串内容的非常量指针,而mystring.c_str()
只提供一个const
-qualified 指针。
这取决于您在此处对“包含”的定义。在
std::string temp = "hello whats up";
有几点需要注意:
temp.size()
将返回从第一个h
到最后一个字符的数量p
(包括)temp.c_str()
还是temp.data()
会带着null
终结者返回int(temp[temp.size()])
将是零我知道,我听起来与这里的一些答案相似,但我想指出in是单独维护size
的,除非你找到第一个终止符,否则它不像in那样继续计数。std::string
C++
C
null
string literal
补充一点,如果你的contains 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
参考:
是的,如果您调用temp.c_str()
,那么它将返回以空值结尾的 c 字符串。
但是,存储在对象中的实际数据temp
可能不是以空值结尾的,但这对程序员来说并不重要,也不应该在意,因为当程序员想要时const char*
,他会调用c_str()
对象,这保证返回 null - 终止的字符串。
使用 C++ 字符串,您不必担心这一点,它可能取决于实现。
使用temp.c_str()
你得到字符串的 C 表示,它肯定包含\0
字符。除此之外,我真的不明白它对 C++ 字符串有什么用处
std::string
内部保持对字符数的计数。在内部,它使用这个计数工作。就像其他人所说的那样,当您需要显示字符串或任何原因时,您可以使用它的c_str()
方法,该方法将为您提供最后带有空终止符的字符串。