为什么C++ std::string初始化后赋值的\0终止符会被忽略?
核心原因
两个场景的差异是std::string的构造逻辑、自身长度属性的规则,以及标准库输出std::string的逻辑共同导致的:
场景1运行逻辑
- 你调用
std::string构造函数时传入的是C风格字符串字面量,C风格字符串默认以第一个\0作为结束标志。 - 构造函数会先计算传入的C字符串长度,遇到字面量里的
\0就会停止读取,最终构造出来的std::string对象的size()值为13,仅包含\0之前的This is a sam内容,后面的ple text完全不会被存入字符串对象内部。 std::cout输出std::string时,只会按照对象的size()值输出对应长度的字符,所以最终输出结果为This is a sam。
场景2运行逻辑
- 第一步构造
std::string时传入的C字符串没有中间的\0,所以构造出的字符串对象会完整存储所有内容,size()值为21,和整个字符串的实际长度一致。 - 执行
my_string[13]='\0'仅修改了字符串内部缓冲区中下标为13的字符值,完全不会改变字符串对象本身的size()属性,size()仍然为21。 std::cout输出std::string时不会把内部的\0当作终止符,只会严格按size()长度输出所有字符:下标13的\0是不可见控制字符,控制台会将其渲染为空白,所以原位置的p变成了空格,后面的字符照常输出,最终结果就是This is a sam le text。
验证方法:你可以分别在两个场景中打印
my_string.size()的值,场景1会输出13,场景2会输出21,可直接验证上述逻辑。
内容的提问来源于stack exchange,提问作者Parth Yadav
相关产品推荐
相关产品推荐

