C++:null字符如何在std :: string中工作?

Cap*_*nci 3 c++ string

我来自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)

输出:你好

预期产量:你好,世界

如果有人能解释这种行为背后的原因,将会有所帮助.

IIn*_*ble 9

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)

产生这个输出:

Hello, World
Run Code Online (Sandbox Code Playgroud)


*std::string维护一个显式长度成员,因此它不需要保留一个字符作为字符串结尾的标记.