C++获取字符串最后一个字符方法
作者:WarmHope
时间:2026-01-24
浏览:0
最推荐使用back()获取最后一个字符,前提是先检查字符串非空;它直观安全、支持读写,而operator[]和at()需手动计算下标且存在越界风险,end()-1和c_str()+strlen则更复杂低效。
最推荐使用 back() 获取最后一个字符,前提是先检查字符串非空;它直观安全、支持读写,而 operator[] 和 at() 需手动计算下标且存在越界风险,end()-1 和 c_str()+strlen 则更复杂低效。

用 back() 直接获取最后一个字符(C++11 起)
std::string::back() 是最直观、最安全的方式,前提是字符串非空。它返回对最后一个字符的引用,支持读写。
- 如果字符串为空,调用
back()是未定义行为(UB),运行时可能崩溃或静默出错 - 适用于所有标准容器(
vector、deque等),语义统一 - 比
at(size()-1)或[size()-1]更具可读性,且不涉及下标计算
std::string s = "hello";
if (!s.empty()) {
char last = s.back(); // 'o'
s.back() = 'O'; // 修改为 "hellO"
}用 operator[] 或 at() 访问末尾(需手动算下标)
两种方式都依赖 size(),但安全性差异明显:
s[s.size()-1]:不检查边界,s.size()==0时下标为-1(无符号整数溢出 → 极大正数),必然越界访问s.at(s.size()-1):会抛出std::out_of_range异常,但仅当s.size()==0时触发(因为size()-1对size_t是极大值,仍越界)- 真正安全的写法必须先判空:
!s.empty() ? s[s.size()-1] : '\0'
std::string s = ""; // ❌ 危险!s.size() 是 0u,0u-1 == 18446744073709551615 // char c = s[s.size()-1];// ✅ 安全写法 char last = s.empty() ? '\0' : s[s.size()-1];
为什么不能用 end()-1?
std::string::end() 返回的是 past-the-end 迭代器,指向末尾字符之后的位置。对它做减法看似可行,但有陷阱:
*(s.end()-1)在非空时能取到末字符,但s.end()本身不可解引用- 若
s.empty(),s.end() == s.begin(),此时s.end()-1是非法迭代器操作(对随机访问迭代器也不允许减到begin()之前) - 代码可读性差,且不如
back()直观;在调试器中也更难观察
std::string s = "a";
if (!s.empty()) {
char last = *(s.end() - 1); // 可行,但没必要绕路
}兼容 C 风格字符串的写法(c_str() + strlen)
仅在需要与 C 接口交互或处理遗留代码时考虑,日常 C++ 编程中应避免:
s.c_str()返回const char*,无法修改末字符- 需要
#include,且strlen时间复杂度是 O(n),而size()是 O(1) - 多线程下若
s被修改,c_str()返回的指针可能失效(尽管 C++11 起保证短字符串优化后仍有效,但逻辑上不推荐依赖)
// 不推荐,仅作对比 #includestd::string s = "test"; if (!s.empty()) { const char* cstr = s.c_str(); char last = cstr[strlen(cstr) - 1]; // 't' }
空字符串检查不是形式主义——所有基于长度或迭代器的末尾访问都依赖它,而 back() 最简洁,也最容易漏掉这个前提。
作者最新文章
Photoshop图层阵列怎么做?复制多个图层并整齐排列
2026-09-22 16:42
3dmax动画技巧总结:动画制作步骤与渲染视频教程
2026-09-22 14:47
思源笔记
2026-09-16 17:42
在线PDF转TXT操作步骤与乱码排查指南
2026-09-04 13:02
PDF加水印后如何检查显示效果?在线工具操作步骤与避坑指南
2026-09-03 13:02
上一篇:
宝书网耽美小说资源入口
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































