【发布时间】:2017-03-07 16:41:25
【问题描述】:
我来自 C 背景,在学习 C++ 时遇到了<string> 头文件。在 C 中,字符串是一个以'\0' 结尾的字符数组。
但是,在std::string 中,我发现情况并非如此,并且在任何有效索引处插入/替换 null 字符时不会像我预期的那样修剪字符串。
string s;
getline(cin, s);
// remove all punctuation
for(string::size_type i = 0, n = s.size(); i < n; i++)
{
if(ispunct(s[i]))
s[i] = '\0';
}
输入:你好,世界!!!!
输出:Hello World
预期输出:你好
在观察上述行为时,我假设 C++ 中的字符串不是以空值结尾的。然后我在 SO Use of null character in strings (C++) 上发现了这个问题,这让我很困惑。
string s = "Hello\0, World";
cout << s << endl;
输出:你好
预期输出:你好,世界
如果有人能解释这种行为背后的原因,将会很有帮助。
【问题讨论】:
-
把
std::string想象成一个std::vector<char>,它有一个隐藏的额外元素'\0'。这是一个实现细节。获得空终止数组的唯一保证方法是通过std::string::c_str()。 -
C++ 中有不止一种字符串。有一种与 C 完全兼容的类型,包括空终止。还有另一种是来自
<string>标头的std::string。第二种字符串不是以空字符结尾的字符数组。