You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 20:57:00