substr(1, str.length()-2)可安全截取去首尾子串,但需先判断长度≥2;erase()需先删末尾再删开头以防下标偏移,且空串、单双字符均须校验。

用 substr() 截取中间部分最直接
如果字符串长度 ≥ 2,substr(1, str.length() - 2) 就能拿到去掉首尾后的子串。它不修改原字符串,而是返回新字符串,安全且语义清晰。
-
substr(1)从下标 1 开始取到末尾(只去首);要同时去尾,必须显式指定长度 - 注意:当
str.length() 时,<code>substr(1, ...)会触发未定义行为或抛出std::out_of_range—— 务必先判断长度 - 示例:
std::string s = "hello"; auto res = s.substr(1, s.size()-2); // "ell"
用 erase() 原地修改更节省内存
想复用原字符串对象、避免拷贝,可用 erase() 连续删两次。但要注意删除顺序:先删末尾再删开头,否则下标会偏移。
- 正确顺序:
s.erase(s.size()-1, 1); s.erase(0, 1); - 错误写法:
s.erase(0, 1); s.erase(s.size()-1, 1);—— 第一次删首后,原末尾字符已移到s.size()-1位置,第二次删的可能不是原来那个字符 - 同样需前置校验:
if (s.size() >= 2) { ... },否则erase可能越界
边界情况比想象中更容易出错
空串、单字符、双字符这三类输入最容易被忽略,但它们直接影响逻辑是否健壮。
- 空串
"":size() == 0,任何substr(1,...)或erase都非法 - 单字符
"a":删完首尾后应为空串,但若没检查就调substr(1, -1)(实际传负数会转成极大正数),结果未定义 - 双字符
"ab":删完应得空串,此时substr(1, 0)是合法的,返回空字符串 —— 这点可以利用,但别依赖“碰巧有效”
实际写的时候,别图省事把校验逻辑藏在三元表达式里。多一行 if (s.size() 能避开一堆运行时意外。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











