下面的字符串是否包含空终止符'\0'?
'\0'
std::string temp = "hello whats up";
ujv3wf0j1#
不,但是如果你说temp.c_str(),一个空终止符将包含在这个方法的返回中。同样值得一提的是,可以像其他字符一样在字符串中包含空字符。
temp.c_str()
string s("hello"); cout << s.size() << ' '; s[1] = '\0'; cout << s.size() << '\n';
印刷品5 5如果空字符对字符串有特殊意义,则不会像您所期望的那样使用5 1。
5 5
5 1
gev0vcfq2#
在C03中没有,甚至在C11之前也不能保证在C中std::string在内存中是连续的。只有C字符串(用于存储字符串的char数组)有null终止符。在C11和更高版本中,mystring.c_str()等价于mystring.data()等价于&mystring[0],并且mystring[mystring.size()]保证为'\0'。在C++17及更高版本中,mystring.data()还提供了一个重载,返回一个非常量指针指向字符串的内容,而mystring.c_str()只提供了一个const限定的指针。
mystring.c_str()
mystring.data()
&mystring[0]
mystring[mystring.size()]
const
eeq64g8w3#
这取决于您在此处对“contain”的定义。在
有几点需要注意:
temp.size()
h
p
temp.data()
null
int(temp[temp.size()])
我知道,我听起来与这里的一些答案相似,但我想指出的是,C++中std::string的size是单独维护的,它不像C中的那样,除非找到第一个null终结符,否则您会一直计数。另外,如果您的string literal包含嵌入的\0,则情况会稍有不同。在这种情况下,std::string的构造在第一个null字符处停止,如下所示:
C++
std::string
size
C
string literal
\0
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
参考文献:
628mspwn4#
是的,如果你调用temp.c_str(),那么它将返回以空结尾的c字符串。然而,存储在对象temp中的实际数据可能不是以空结尾的,但这对程序员来说并不重要,也不应该重要,因为当程序员需要const char*时,他会在对象上调用c_str(),这保证返回以空结尾的字符串。
temp
const char*
c_str()
eanckbw95#
对于C字符串,你不必担心这个问题,它可能依赖于实现。使用temp.c_str()可以得到字符串的C表示,其中肯定包含\0字符。除此之外,我真的看不出它对C字符串有什么用
uklbhaso6#
std::string在内部保存了字符数的计数,内部使用这个计数工作,就像其他人说的,当你需要显示字符串或其他原因时,你可以使用它的c_str()方法,它会给予你一个结尾为空的字符串。
6条答案
按热度按时间ujv3wf0j1#
不,但是如果你说
temp.c_str()
,一个空终止符将包含在这个方法的返回中。同样值得一提的是,可以像其他字符一样在字符串中包含空字符。
印刷品
5 5
如果空字符对字符串有特殊意义,则不会像您所期望的那样使用
5 1
。gev0vcfq2#
在C03中没有,甚至在C11之前也不能保证在C中std::string在内存中是连续的。只有C字符串(用于存储字符串的char数组)有null终止符。
在C11和更高版本中,
mystring.c_str()
等价于mystring.data()
等价于&mystring[0]
,并且mystring[mystring.size()]
保证为'\0'
。在C++17及更高版本中,
mystring.data()
还提供了一个重载,返回一个非常量指针指向字符串的内容,而mystring.c_str()
只提供了一个const
限定的指针。eeq64g8w3#
这取决于您在此处对“contain”的定义。在
有几点需要注意:
temp.size()
将返回从第一个h
到最后一个p
(包含两个)的字符数temp.c_str()
或temp.data()
将返回一个null
终止符int(temp[temp.size()])
将为零我知道,我听起来与这里的一些答案相似,但我想指出的是,
C++
中std::string
的size
是单独维护的,它不像C
中的那样,除非找到第一个null
终结符,否则您会一直计数。另外,如果您的
string literal
包含嵌入的\0
,则情况会稍有不同。在这种情况下,std::string
的构造在第一个null
字符处停止,如下所示:参考文献:
628mspwn4#
是的,如果你调用
temp.c_str()
,那么它将返回以空结尾的c字符串。然而,存储在对象
temp
中的实际数据可能不是以空结尾的,但这对程序员来说并不重要,也不应该重要,因为当程序员需要const char*
时,他会在对象上调用c_str()
,这保证返回以空结尾的字符串。eanckbw95#
对于C字符串,你不必担心这个问题,它可能依赖于实现。
使用
temp.c_str()
可以得到字符串的C表示,其中肯定包含\0
字符。除此之外,我真的看不出它对C字符串有什么用uklbhaso6#
std::string
在内部保存了字符数的计数,内部使用这个计数工作,就像其他人说的,当你需要显示字符串或其他原因时,你可以使用它的c_str()
方法,它会给予你一个结尾为空的字符串。