C++运行抛出std::out_of_range异常basic_string::at访问越界问题求助
报错原因排查
你收到的报错是调用空字符串的at()方法触发的下标越界异常,核心问题出在以下几点:
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at: __n (which is 0) >= this->size() (which is 0)
- 你声明
std::string nm_1;时初始化的是空字符串,长度为0,直接调用nm_1.at(temp)赋值时,访问的下标位置超出了字符串实际长度,就会抛出上述std::out_of_range异常。同时你在for循环内部又重复定义了一个同名的局部nm_1变量,会覆盖外层的nm_1,导致最后要输出的外层nm_1自始至终都是空值,执行nm_1.at(temp - 1) = '0';时会再次触发越界。 - 你没有判断
find("{")和find("}")的返回值,如果输入字符串中没有匹配的大括号,bracket_pos_1和bracket_pos_2的值为std::string::npos,后续调用substr也会触发异常。 - 你的循环逻辑存在死循环风险:只要没碰到小数点和逗号,循环判断条件
i < 2会一直成立,temp无限自增最终访问split_string的越界下标。 - 你要提取第一个大括号到逗号之间的double值,不需要手动遍历判断数字和小数点,直接通过字符串截取+类型转换即可实现,逻辑更简洁也不容易出错。
修复后代码示例
#include <iostream> #include <string> int main() { std::string funct; std::cout << "-->"; std::cin >> funct; if (funct.find("math") != std::string::npos) { // 校验大括号是否存在 size_t bracket_pos_1 = funct.find("{"); size_t bracket_pos_2 = funct.find("}"); if (bracket_pos_1 == std::string::npos || bracket_pos_2 == std::string::npos || bracket_pos_1 >= bracket_pos_2) { std::cout << "输入格式错误,未找到匹配大括号" << std::endl; return 1; } // 提取大括号中间的内容 std::string split_string = funct.substr(bracket_pos_1 + 1, bracket_pos_2 - bracket_pos_1 - 1); // 查找逗号位置 size_t comma_pos = split_string.find(","); if (comma_pos == std::string::npos) { std::cout << "输入格式错误,未找到分隔逗号" << std::endl; return 1; } // 截取大括号后到逗号前的内容转double std::string nm_1_str = split_string.substr(0, comma_pos); double nm_1 = std::stod(nm_1_str); std::cout << std::endl << std::endl << nm_1; } return 0; }
内容的提问来源于stack exchange,提问作者user16998415
相关产品推荐
相关产品推荐

