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

'\0'在字符数组与String中的不同行为及原因求解

二者行为差异的根本原因是两类字符串的长度标识逻辑完全不同

1. C风格字符数组char str[]的处理逻辑

  • C语言原生的字符串没有单独存储长度的元数据,所有字符串处理逻辑都默认把'\0'作为字符串的结束标记
  • 你定义的char str[] = "Hello"实际在内存中存储的是6个字符:['H','e','l','l','o','\0'],末尾的'\0'是编译器自动添加的结束标记
  • 当你执行str[2] = '\0'后,数组存储变为['H','e','\0','l','l','o','\0'],用printf、cout等方式输出C风格字符串时,只要读到第一个'\0'就会直接终止输出,因此最终只会输出前两个字符He

2. C++ std::string的处理逻辑

  • std::string是封装好的字符串类,内部会单独维护一个size字段存储字符串的实际长度,'\0'对它而言只是一个普通的不可见控制字符,没有特殊的结束含义
  • 你执行s[2] = '\0'之后,std::string的长度仍然是5,内部存储的内容为['H','e','\0','l','o']
  • 输出std::string时,程序会按照size字段的值输出全部5个字符,只是索引2位置的'\0'是不可见字符,不会被渲染出来,因此看起来像是索引2的字符被移除了,最终显示结果为Helo

补充验证:你可以调用s.size()查看长度,结果仍然是5而非4,也可以通过循环遍历每个字符的ASCII码确认'\0'仍然存在。


内容的提问来源于stack exchange,提问作者mhhabib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:24:03