程序运行触发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
相关产品推荐
相关产品推荐

