resize后原内容仍在,前提是new_size≥原size;新增位置用'\0'填充,size()更新为new_size,但'\0'是有效字符而非c字符串结束符。

resize 后原内容还在吗?
resize 不会破坏已有内容,前提是新长度不小于原长度。它只保证索引 [0, new_size) 范围内有效:若 new_size ,末尾字符被截断;若 <code>new_size > size(),新增位置用默认值(char(),即 '\0')填充。
怎么安全地扩大 string 而不丢数据?
扩大时只要确保 new_size >= str.size(),原有字符就完整保留,后续位置补 '<p>扩大时只要确保 <code>new_size >= str.size(),原有字符就完整保留,后续位置补 '\0'。但要注意:这不会改变字符串的逻辑长度(size() 会变成 new_size),且新增的 '\0' 是有效字符,不是 C 风格字符串的结束符。
size() 会变成 new_size),且新增的 '<p>扩大时只要确保 <code>new_size >= str.size(),原有字符就完整保留,后续位置补 '\0'。但要注意:这不会改变字符串的逻辑长度(size() 会变成 new_size),且新增的 '\0' 是有效字符,不是 C 风格字符串的结束符。' 是有效字符,不是 C 风格字符串的结束符。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 推荐写法:
str.resize(100);—— 原内容在[0, str.size())内不变 - 避免误用:
str.resize(50, 'x');会用'x'填充新增部分,不是默认'\0',除非你明确需要 - 如果之后要当 C 字符串用(比如传给
printf),记得手动加结尾'\0'或用c_str()
resize 和 reserve 的关键区别在哪?
resize 改变的是逻辑大小和实际内容(修改 size() 和内存内容);reserve 只预分配内存、不改变 size()、也不动现有字符。常见错误是以为 reserve 能让 str[5] = 'a' 合法——其实不行,必须 resize 或 push_back 让索引有效。
-
str.reserve(100);→ 容量 ≥100,size()不变,str[0]仍越界(若原为空) -
str.resize(100);→size()变成 100,str[0]到str[99]全部可读写 - 混合使用合理:
str.reserve(1000); str.resize(100);避免多次扩容
resize 后访问新增位置为什么有时看到乱码?
因为新增字节是 char()(即 0),但如果你用 printf("%s", str.data()) 这类 C 风格输出,遇到第一个 '\0' 就停了——而 resize 出来的字符串开头可能全是 '\0',导致看似“空”或“乱码”。这不是 resize 破坏了内容,而是你没按 string 的方式访问。
- 正确打印:
cout 或 <code>printf("%.*s", (int)str.size(), str.data()); - 调试时别只看
str.data()的 C 字符串表现,要看str.size()和逐字节检查 - Windows 控制台对
'\0'显示尤其容易误导,建议用十六进制查看前几字节
string 不是 C 字符串,resize 操作的是容器语义下的字符序列,所有行为都以 size() 为边界,而不是以 '\0' 为终点。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










