我来自C背景,在学习C++时我遇到了<string>头文件.在C字符串中,将是一个以字符结尾的字符数组'\0'.
但是,在std::string我发现情况并非如此,并且在任何有效索引处插入/替换空字符时,不会像我期望的那样修剪字符串.
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';
}
Run Code Online (Sandbox Code Playgroud)
输入:你好,世界!!!!
输出:Hello World
预期产量:你好
在观察上述行为时,我假设C++中的字符串不是空终止的.然后我发现这个问题在字符串中使用空字符(C++)这让我感到困惑.
string s = "Hello\0, World";
cout << s << endl;
Run Code Online (Sandbox Code Playgroud)
输出:你好
预期产量:你好,世界
如果有人能解释这种行为背后的原因,将会有所帮助.
std::string支持嵌入的NUL字符*.您的示例代码不会产生预期结果的事实是,因为您正在构建std::string一个指向零终止字符串的指针.没有长度信息,并且c'tor在第一个NUL角色处停止.s包含Hello,因此输出.
如果要构造std::string具有嵌入式NUL字符的a,则必须使用带有显式长度参数的c'tor:
std::string s("Hello\0, World", 13);
std::cout << s << std::endl;
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
Run Code Online (Sandbox Code Playgroud)Hello, World
std::string维护一个显式长度成员,因此它不需要保留一个字符作为字符串结尾的标记.