105

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

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

6 回答 6

112

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

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

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

印刷

5 5

如果空字符对字符串有特殊含义,则不像5 1您所期望的那样。

于 2012-08-01T04:51:32.237 回答
93

不在 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 指针。

于 2012-08-01T04:52:48.463 回答
18

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

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

有几点需要注意:

  • temp.size()将返回从第一个h到最后一个字符的数量p(包括)
  • 但同时temp.c_str()还是temp.data()会带着null终结者返回
  • 或者换句话说int(temp[temp.size()])将是

我知道,我听起来与这里的一些答案相似,但我想指出in是单独维护size的,除非你找到第一个终止符,否则它不像in那样继续计数。std::stringC++Cnull

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

参考:

于 2017-12-15T21:19:09.070 回答
2

是的,如果您调用temp.c_str(),那么它将返回以空值结尾的 c 字符串。

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

于 2012-08-01T04:51:45.463 回答
1

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

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

于 2012-08-01T04:53:43.123 回答
1

std::string内部保持对字符数的计数。在内部,它使用这个计数工作。就像其他人所说的那样,当您需要显示字符串或任何原因时,您可以使用它的c_str()方法,该方法将为您提供最后带有空终止符的字符串。

于 2012-08-01T04:59:38.907 回答