std::string::back()适用于非空字符串取末字符,substr()适合多字符后缀判断但需先检查长度,手动下标访问兼容性好且可控;所有方法均须防范空串或长度不足导致的崩溃。

用 std::string::back() 快速取末字符(仅适用于非空字符串)
如果确定字符串不为空,back() 是最直接的方式:它返回最后一个字符的引用,比 at() 或下标访问更轻量,且不检查边界——但前提是字符串非空。空串调用会触发未定义行为。
- ✅ 正确用法:
if (!s.empty() && s.back() == 'x') - ❌ 危险写法:
s.back() == 'x'(未判空,崩溃风险) - ⚠️ 注意:
back()对const std::string返回const char&,不能用于修改
用 std::string::substr() 判断后缀(支持多字符结尾)
当需要判断是否以某个子串(如 "ing"、".txt")结尾时,substr() 更通用。核心思路是截取末尾等长子串再比较,但必须先检查长度,否则 substr() 抛出 std::out_of_range。
- ✅ 安全写法:
if (s.length() >= 3 && s.substr(s.length() - 3) == "ing") - ❌ 常见错误:
s.substr(s.length() - 3) == "ing"(空串或长度不足时崩溃) - ? 提示:C++20 起可用
s.ends_with("ing"),但需编译器支持-std=c++20
手动遍历末尾字符(兼容老标准,控制粒度高)
在无法使用 C++20 或需避免临时字符串开销时,可直接用下标访问。这种方式显式控制索引,不易出错,也便于扩展为“忽略大小写”或“跳过空白”等逻辑。
- ✅ 推荐模式:
if (s.size() >= 1 && s[s.size() - 1] == 'x') - ✅ 多字符场景:
if (s.size() >= n && std::equal(s.end() - n, s.end(), target.begin())) - ⚠️ 注意:
s.size() - n是无符号整数,若s.size() 会导致极大正数索引,必须前置长度判断
第三方库或自定义工具函数(避免重复造轮子)
项目中频繁判断后缀时,硬编码长度检查易出错。封装一个工具函数能提升可读性和安全性,比如:
bool ends_with(const std::string& s, const std::string& suffix) {
if (suffix.size() > s.size()) return false;
return std::equal(s.end() - suffix.size(), s.end(), suffix.begin());
}
这个版本不依赖 C++20,也不产生临时子串,性能可控;但要注意 suffix 为空时返回 true(符合多数语义),若业务要求严格匹配非空后缀,需额外判断。
真正容易被忽略的是空字符串和边界长度的组合情况——哪怕只漏掉一个 !s.empty() 或 s.size() >= n,上线后就可能 crash。别依赖“我保证这不会为空”,代码得自己守住底线。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











