You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

程序运行触发terminate:抛出std::out_of_range异常(string::substr越界)

解决std::out_of_range: basic_string::substr的错误

这个错误信息已经把问题说得明明白白:你调用std::string::substr(1, ...)的时候,目标字符串的长度是0——简单说就是你在一个空字符串上尝试从第1个字符开始截取子串,这完全不符合逻辑,所以程序直接抛出了越界异常。

结合你的程序场景(输出日/中文字符,让用户输入对应文本),我帮你梳理几个最可能的原因和解决办法:

最常见的原因:用户输入为空

你大概率是在获取用户输入后,没做任何检查就直接调用了substr。比如用户没输入任何内容就回车,导致存储输入的std::string是空的(size() == 0),这时候你用pos=1去截取,肯定触发越界。

解决办法:先检查输入是否为空

在处理输入前加个判断,确保用户输入了有效内容:

std::string user_input;
// 用getline读取整行输入,避免被空格截断
std::getline(std::cin, user_input);

// 先判断输入是否为空
if (user_input.empty()) {
    std::cout << "请输入有效的对应文本哦!" << std::endl;
    // 可以在这里重新获取输入,比如放到循环里
    return; // 或者跳过后续处理逻辑
}

// 确认输入非空后,再执行substr操作
std::string sub = user_input.substr(1); // 现在就不会触发越界了

可能的隐藏原因:多字节字符处理错误

因为你涉及日/中文字符(UTF-8编码下是多字节的,比如一个中文字符占3字节),如果你错误地把std::string的字节长度当成了字符个数,比如误以为每个字符占1字节,计算出来的pos值超出了实际字符串的字节长度,也可能触发这个错误。不过你的错误里显示size() == 0,所以这个场景概率较低,但还是提醒你:

处理UTF-8多字节字符时,不能直接用std::string::substr按字节截取“单个字符”,这会导致乱码或者越界。如果需要按字符截取,建议用专门的多字节字符串处理库,或者手动计算每个字符的字节长度。

下一步排查建议

如果上面的方法没解决,你可以:

  • 用调试器打断点,定位到抛出异常的那行substr代码,查看调用它的字符串的内容和size()值,确认是不是空的或者长度不够。
  • 把你调用substr的相关代码片段贴出来,能更精准地定位问题。

内容的提问来源于stack exchange,提问作者Joe.Shmoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:40:21