最直接方式是pop_back(),但需确保字符串非空;兼容旧标准可用erase(s.size()-1,1)或resize();删后若需访问首字符须再次判空;substr赋值有性能与越界风险。

用 pop_back() 最直接,但要注意 C++11 及以上
如果确定字符串非空,pop_back() 是最简洁安全的方式,它就干一件事:删掉最后一个字符,不返回值,原地修改。
- 必须确保
s.empty() == false,否则行为未定义(常见崩溃) - C++11 引入,老项目若用 C++98/03 编译会报错:
“'pop_back' is not a member of 'std::basic_string' - 比
erase()少一次长度计算,性能略优(不过对绝大多数场景可忽略)
兼容旧标准?用 erase(s.size()-1, 1) 或 resize()
当需要支持 C++98 或不确定编译器版本时,两个等效方案:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
s.erase(s.size()-1, 1):指定从倒数第一个位置删 1 个字符;注意s.size()是size_t,空串时s.size()-1会绕成极大正数,必须先判空 -
s.resize(s.size() > 0 ? s.size()-1 : 0):更直观,resize()超出当前长度会补 '\0',但缩小时直接截断,不会越界
删完还要检查是否为空?别忘了边界逻辑
很多实际场景(比如处理路径、JSON 字段、用户输入末尾的换行)删最后一个字符后,字符串可能变空。这时候继续访问 s.back() 或 s[0] 就危险了。
- 删之前建议统一加判断:
if (!s.empty()) s.pop_back(); - 删之后若需取首字符,不能省略
if (!s.empty()) - 用
std::string_view做只读切片时,substr(0, s.size()-1)更安全(不修改原串,且空串时s.size()-1在substr内部被正确处理)
为什么不用 substr(0, s.length()-1) 直接赋值?
写成 s = s.substr(0, s.length()-1); 看似可行,但有隐含成本和风险:
- 每次调用都分配新内存、拷贝内容,对长字符串或高频操作影响明显
- 空串时
s.length()-1是无符号整数下溢,结果是18446744073709551615,substr会抛std::out_of_range - 不如原地修改语义清晰,也容易让静态分析工具误报潜在越界
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










