最安全获取前两个字符的方法是先检查长度再用substr(),或用string_view::substr()自动截断;substr()越界抛异常,string_view越界自动截断,[]越界未定义。

用 substr() 最直接,但要注意越界
获取前两个字符最常用的是 substr() 成员函数,它接受起始位置和长度两个参数:str.substr(0, 2)。但前提是字符串长度 ≥ 2,否则会抛出 std::out_of_range 异常(在 debug 模式下更易触发)。
实际使用时建议先检查长度:
std::string s = "a"; std::string first_two = s.length() >= 2 ? s.substr(0, 2) : s;
-
s.substr(0, 2)在空串或单字符串上调用会越界,不是返回空串或截断 - 即使你确定输入非空,也建议加保护——用户输入、文件读取、网络响应都可能意外短于预期
-
substr()返回新字符串,不修改原串,开销小但非零(涉及内存分配)
用迭代器 + std::string_view 避免拷贝(C++17 起)
如果只是读取、不需修改且想避免构造新字符串,std::string_view 更轻量:
std::string s = "hello";
std::string_view sv{s};
std::string_view first_two = sv.substr(0, 2); // 安全:超长时自动截断
-
string_view::substr()不抛异常,长度超出时只返回到末尾,行为更鲁棒 - 适用于日志提取、协议解析等高频、只读场景
- 注意生命周期:
string_view不拥有数据,所指字符串必须比 view 存活得久
用 at() 或 [] 手动拼接(适合极简逻辑)
当明确知道长度足够,且只需要两个 char(比如做简单判断),可直接索引:
立即学习“C++免费学习笔记(深入)”;
std::string s = "ab";
if (s.length() >= 2) {
char c1 = s[0];
char c2 = s[1];
// 后续处理 c1 和 c2
}
-
s[0]不检查边界,s.at(0)会抛异常,选哪个取决于你是否需要运行时兜底 - 别写
std::string(s[0]) + s[1]—— 这会隐式转换失败,编译不过;正确写法是std::string(1, s[0]) + std::string(1, s[1]),但太啰嗦 - 这种写法适合嵌入条件表达式或模板元编程中对字符的原子访问
substr() 严格、string_view::substr() 宽松、[] 未定义行为。std::string 的设计本意是安全优先,但很多老代码仍默认“不会越界”,结果在线上环境因边缘输入崩掉。


















