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

时间:2017-03-07 16:41:26

标签: c++ string

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

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

1 个答案:

答案 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维护一个显式长度成员,因此不需要保留一个字符作为字符串结尾的标记。