如何构建一个包含嵌入空值的std::string?

108

如果我想用这样的一行构造一个 std::string:

std::string my_string("a\0b");

我想在最终的字符串中包含三个字符(a,null,b),但我只得到了一个。正确的语法是什么?

我希望最终的字符串包含三个字符(a,null,b),但我只得到了一个。请问应该使用什么正确的语法?


4
请注意,如果您将'b'替换为任何数字字符,将会默默地创建错误的字符串。参见:https://dev59.com/5Wkv5IYBdhLWcg3w91hF - David Stone
11个回答

-8
几乎所有的std::string实现都是以空字符结尾的,所以你可能不应该这样做。请注意,“a\0b”实际上有四个字符,因为自动添加了空字符终止符(a、null、b、null)。如果你真的想这样做并且打破std::string的约定,你可以这样做:
std::string s("aab");
s.at(1) = '\0';

但是如果你这样做了,所有的朋友都会嘲笑你,你永远也找不到真正的幸福。


1
std::string 不要求以 NULL 结尾。 - Martin York
2
虽然不是必须的,但在几乎所有的实现中都需要这样做,可能是因为需要c_str()访问器来提供给您空终止的等效形式。 - Jurney
2
为了提高效率,数据缓冲区的末尾可能会保留一个空字符。但是,在字符串上执行的任何操作(即方法)都不使用此知识或受到包含NULL字符的字符串的影响。 NULL字符将以与任何其他字符完全相同的方式进行操作。 - Martin York
这就是为什么字符串是std::,它的行为在任何平台上都没有定义,所以很有趣。 - user595447
1
我希望用户595447仍然在这里,这样我就可以问他们到底在说些什么。 - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接