std::string 是否有空终止符?

问题描述 投票:0回答:7

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

'\0'

std::string temp = "hello whats up";
c++ string null stdstring null-terminated
7个回答
140
投票

不,但是如果您说

temp.c_str()
,此方法的返回值中将包含一个空终止符。

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

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

打印

5 5

而不是您可能期望的

5 1
,如果空字符对字符串有特殊含义。


117
投票

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

在 C++11 及更高版本中,

mystring.c_str()
相当于
mystring.data()
相当于
&mystring[0]
,并且
mystring[mystring.size()]
保证为
'\0'

在 C++17 及更高版本中,

mystring.data()
还提供重载,返回指向字符串内容的非常量指针,而
mystring.c_str()
仅提供
const
限定的指针。


21
投票

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

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

有几点需要注意:

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

我知道,我听起来与这里的一些答案类似,但我想指出,

size
中的
std::string
C++
是单独维护的,它不像C中的
那样你一直在计数,除非你找到了第一个 
null
 终结者。

补充一下,如果您的

string literal

 包含嵌入的 
\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

参考文献:

  • https://akrzemi1.wordpress.com/2014/03/20/strings-length/
  • http://en.cppreference.com/w/cpp/string/basic_string/basic_string

2
投票
是的,如果你调用

temp.c_str()

,那么它将返回以 null 结尾的 c 字符串。

然而,存储在对象

temp

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


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

使用

temp.c_str()

 你会得到字符串的 C 表示形式,其中肯定会包含 
\0
 字符。除此之外,我真的不明白它在 C++ 字符串上有什么用处


1
投票

std::string

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


0
投票
很明显,自 2015 年以来,一些疱疹患者一直受到抗病毒药物和其他补充病毒药物的困扰,直到一位博主向我介绍了她,她还在网上讲述了她在使用 Dr Sikies Herbal Medicine 后如何治愈生殖器疱疹的故事。自从我从生殖器疱疹中分娩以来已经一年零两周了。感谢上帝使用这位伟大的草药师来治愈我。我已经承诺会继续讲述西奇斯博士的好话。请随时与他分享您的问题,并且不要忘记告诉他我确实将您推荐给了他。谢谢。在邮件中写信给他

[电子邮件受保护] 或通过 WhatsApp 发送他的电话号码 +2348163430143  他治疗阿尔茨海默病毒、癌症、艾滋病毒、疱疹、生殖器、疣、ALS、BV、UTI、处女感染、生殖器、疣、HPV、肝炎B,祝你好运,HSV,怀孕,前男友回来了。  现在就从他的网站订购:https://drsikiesherbalcuremedicine.weebly.com/ 您可以通过邮件联系我:[电子邮件受保护]

© www.soinside.com 2019 - 2024. All rights reserved.