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


87

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

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

谢谢!:)



1
现在,@ jahhaj接受的答案与user529758的答案相冲突,后者的答案可以说是最新的。在细读时,我跳过了杰西·古德(Jesse Good)的评论,因此在此强调其重要性。
乔纳森·科马尔

Answers:


99

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

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

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

版画

5 5

而不是5 1您所期望的,如果空字符对字符串具有特殊含义。


5
如果调用temp.c_str(),则将包含空字符。如果您确实需要在字符串中添加它,则可以像添加其他任何字符一样添加它。temp.push_back('\0')。现在temp.c_str()将包括两个空字符。
jahhaj 2012年

1
@dupdupdup,正如一些答复中提到的那样,如果您需要以空值结尾的字符串,则应在构造对象上调用s.c_str()。它将返回一个指向字符数组的指针,该指针保证在末尾具有“ \ 0”。
Maksim Skurydzin'8

@Rico,Jahhaj然后如何终止字符串。例如-我在字符串中添加了几个字符str [i]。现在,我无法使用cout打印它。
Bhavuk Mathur

补充一点:由于运算符<<重载,因此cout << s会逐字符打印完整的字符串char,但是,如果您将c_str()放入运算符<<,它将打印直到空字符。接下来的程序说明了这一点。{string s(“ SampleString”); cout << s.size()<<“ \ t” << s << endl; s [3] ='\ 0'; cout <<“ \ n \ n Null之后\ n \ n” << s.size()<<“ \ t” << s << endl; cout <<“ \ n \ n接受c_str \ n \ n” << s.size()<<“ \ t” << s.c_str()<< endl; }
Fooo '18

70

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

在C ++ 11和更高版本中,mystring.c_str()equalmystring.data()等效于&mystring[0],并mystring[mystring.size()]保证为'\0'


4
使用C ++ 11,现在可以保证字符串在内存中是连续的。
zneak

@zneak谢谢!更新。但是我怀疑至少有一些合理的C ++ 11编译器...甚至GCC都已经破坏了对它的支持。

4
@ H2CO3:除了C ++ 11之外,2005年的DR 530中对此进行了解决。绝大多数标准库实现已将字符串数据存储在连续内存中的时间至少保持了同样长的时间。
ildjarn

3
谢谢@ildjarn,我正是在找这个。此举的部分原因是,委员会中没有人知道不使用连续内存的STL实现。
zneak 2012年

7
@ H2CO3:老实说,如果这冒犯了您,则需要较厚的皮肤。
ildjarn

8

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

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内容包含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

参考文献:


2

是的,如果您调用temp.c_str(),则它将返回以null终止的c字符串。

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


1
null终止符(如果存在)也不会包含在from的返回中temp.size()
jahhaj 2012年

1

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

使用temp.c_str()您会获得字符串的C表示形式,其中肯定包含\0char。除此之外,我真的不明白它在C ++字符串上如何有用


1

std::string内部保留字符数的计数。在内部使用此计数起作用。就像其他人所说的那样,当您需要显示字符串或出于任何原因时,可以使用其c_str()方法,该方法将在字符串末尾提供空终止符。


您能为此语句提供一些参考吗?” std :: string在内部保留字符数的计数。在内部使用该计数进行计数”
rimalonfire
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.