首页 > 解决方案 > 为什么“在抛出 'std::out_of_range' what(): basic_string::at: __n (which is 0) >= this->size() (which is 0) 的实例后调用终止”?

问题描述

所以,我不断收到

在抛出 'std::out_of_range' 的实例后调用终止
what(): basic_string::at: __n (which is 0) >= this->size() (which is 0)

当我尝试运行我的代码时的消息。我要做的是让它输出存储在第一个花括号和 nm_1 变量中的逗号之间的双精度值。(*对不起,如果我的代码有点乱,那就晚了)

int main() {
    std::string funct;
    
    std::cout << "-->";
    std::cin >> funct;
    
    if (funct.find("math") != std::string::npos) {
        int bracket_pos_1 = funct.find("{");
        int bracket_pos_2 = funct.find("}");
        int temp = 0;
        // int temp_2 = 0;
        std::string nm_1;
        std::string nm_2;
        auto split_string = funct.substr(bracket_pos_1 + 1, bracket_pos_2 - bracket_pos_1  - 1);
        // string ss = split_string;
        for (int i = 0; i < 2; i) {
            std::string nm_1;
            string ss = split_string;
            if (ss.at(temp) == '0' || ss.at(temp) == '1' || 
                ss.at(temp) == '2' || ss.at(temp) == '3' || 
                ss.at(temp) == '4' || ss.at(temp) == '5' || 
                ss.at(temp) == '6' || ss.at(temp) == '7' ||         
                ss.at(temp) == '8' || ss.at(temp) == '9') {
                nm_1.at(temp) = ss.at(temp);
            } 
            else if (ss.at(temp) == '.') {
                nm_1.at(temp) = ss.at(temp);
                i++;
            }
            else if (ss.at(temp) == ',') {
               i = 2;
            }

            temp++; 
        }
            
        nm_1.at(temp - 1) = '0';
        // std::cout << split_string;
        cout << endl << endl << nm_1;
    }
}

标签: c++

解决方案


第一个问题是这样的:

std::string nm_1;
nm_1.at(temp) = ...

您不能覆盖字符串中不存在的字符。您应该附加到字符串。最简单的方法是使用+=运算符:

nm_1 += ...

第二个问题是这样的:

std::string nm_1;
for (...) {
    std::string nm_1;
    nm_1 += ...

您所做的任何修改都nm_1将发生在循环内的该变量上。问题是该变量在一次迭代结束时被销毁,并在下一次迭代开始时重新创建,因此您在循环内完成的所有修改都将丢失。只需删除该变量定义即可修复它:

std::string nm_1;
for (...) {
    nm_1 += ...

推荐阅读