std::string::c_str()总是返回一个以空字符结尾的字符串吗?

17
我使用strncpy(dest, src_string, 32)std::string转换为char[32],以使我的C++类与传统的C代码配合使用。但是,c_str()方法是否总是返回以空字符结尾的字符串?
可能重复:
string c_str() vs. data()

3
是的,但是如果您的strncpy太小,可能不会将其复制过去。比如,如果您的空终止符在第40个索引处,而您只复制了32个字符。这样就不再以空终止符结尾了。 - im so confused
1
c_str() 返回 C 字符串,由 C 标准定义为以 null 结尾。我认为这不是一个真正的问题,因为我们在这里要做的就是解释什么是“C 字符串”,这并不适合在这个网站上讨论。 - Griwes
@Griwes 我认为这不应该被关闭为NARQ,RTFM是更合适的关闭原因 :) - Praetorian
3个回答

29
std::string的c_str()方法总是返回一个以空字符结尾的字符串吗?
是的。
其规范为:
返回:指针p,使得对于每个i在[0,size()]中,p + i == &operator [](i)。
请注意,对于i指定的范围是闭合的,因此size()是一个有效索引,表示字符串末尾的字符。
operator []的规范如下:
返回:如果pos
在std::string的情况下,它是std::basic_string< char>的别名,因此charT是char,值构造的char具有值零;因此,由std::string :: c_str()的结果指向的字符数组以零结尾。

1
值得一提的是,可能还会有嵌入的NUL字符。也就是说,通过执行str.push_back(0);可以很容易地构造一个包含NUL字符的std::string。这是使用str::string的优点,但也应该牢记。然而,std::string包含嵌入的NUL字符是不寻常的,在许多std::string的用途中,这种情况永远不会发生-它们不会神奇地出现。所以,请注意这一点。 - Bruce Dawson

12

c_str返回一个“C字符串”。而C字符串总是以空字符结尾。这是C标准。

空终止字符串。


2
根据这里的说明,答案是肯定的。

1
哇,我一直都在使用那个网站,为什么它不好了? - im so confused
8
“@nightcracker:使用粗俗语言是不必要的,批评也是如此。是的,cplusplus.com有(过去?)错误和“嗯”的例子,但出于某种原因,这演变成了“噢,这是我憎恨某些东西的机会,超出了合理的批评范畴”。让我们停止这样做。我个人偶尔通过搜索引擎快速查找参考资料。另外,并非每个答案都需要标准引语。” - GManNickG
6
使用这个内容来编写示例代码(甚至生产代码,只要不将其放入头文件)是否合适,完全取决于主观看法,大多数批评也是如此。该网站是关于C++的工作原理参考资料,而不是关于您或其他任何人喜欢如何编写它的。 - Mike Seymour
1
@MikeSeymour,我忘了SO不关心好的风格,只关心“能用=就是好”的原则,我的错。 - Griwes
2
@Griwes:相反,SO上的人们有更多的自由关注良好的风格,因为我们可以说“如果你在没有任何限制的情况下解决问题...”,忽略问题上的任何实际限制。话虽如此,重要的是要明白我们通常是工程师,在一天结束时需要解决问题。 - GManNickG
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接