您的位置:首页 >C++获取字符串最后一个字符方法
发布于2026-01-24 阅读(0)
扫一扫,手机访问
最推荐使用 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_str() + strlen)仅在需要与 C 接口交互或处理遗留代码时考虑,日常 C++ 编程中应避免:
s.c_str() 返回 const char*,无法修改末字符#include <cstring>,且 strlen 时间复杂度是 O(n),而 size() 是 O(1)s 被修改,c_str() 返回的指针可能失效(尽管 C++11 起保证短字符串优化后仍有效,但逻辑上不推荐依赖)// 不推荐,仅作对比
#include <cstring>
std::string s = "test";
if (!s.empty()) {
const char* cstr = s.c_str();
char last = cstr[strlen(cstr) - 1]; // 't'
}空字符串检查不是形式主义——所有基于长度或迭代器的末尾访问都依赖它,而 back() 最简洁,也最容易漏掉这个前提。
上一篇:宝书网耽美小说资源入口
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9