'\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
相关产品推荐
相关产品推荐

