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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:09:02