我来自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 !!!!
输出:Hello World
预期输出:Hello
在观察上述行为时,我假设C ++中的字符串不是以空值终止的。然后我在SO Use of null character in strings (C++)上发现了这个问题。这让我很困惑。
string s = "Hello\0, World";
cout << s << endl;
输出:您好
预期输出:Hello,World
如果有人能解释这种行为背后的原因,将会有所帮助。
答案 0 :(得分:9)
std::string
支持嵌入式NUL字符 * 。您的示例代码未产生预期结果的事实是,因为您正在从指向零终止字符串的指针构造std::string
。没有长度信息,并且c'tor在第一个NUL角色处停止。 s
包含Hello
,因此输出。
如果要构造具有嵌入式NUL字符的std::string
,则必须使用带有显式长度参数的c'tor:
std::string s("Hello\0, World", 13);
std::cout << s << std::endl;
生成this output:
Hello, World
<小时/> *
std::string
维护一个显式长度成员,因此不需要保留一个字符作为字符串结尾的标记。