繁体   English   中英

抛出'std :: out_of_range'what():basic_string :: substr的实例后调用终止

[英]terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr

我收到此错误: 从代码中抛出“ std :: out_of_range'what():basic_string :: substr的实例后调用终止”

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>

using namespace std;

vector <string> n_cartelle;

ifstream in("n_cartelle.txt");
string linea;

while(getline(in,linea))
n_cartelle.push_back(linea);


for(int i=0; i < 4; ++i){


if(n_cartelle[i].substr(n_cartelle[i].size()-3) == "txt")
cout <<"si"<<endl;
else
cout<<"no"<<endl;

}

如果我尝试这样做:

if(n_cartelle[7].substr(n_cartelle[7].size()-3) == "txt")
cout <<"si "<<n_cartelle[7]<<endl;
else
cout<<"no"<<endl;

我没有得到错误。

您所遇到的情况可能是main()脱离异常的情况,该异常终止了程序并给出了特定于操作系统的错误消息,如您所发布的错误消息。

首先,您可以在main()捕获异常。 这将防止您的程序崩溃。

#include <exception>
#include <iostream>

int main()
{
    try
    {
        // do stuff
    }
    catch (std::exception const &exc)
    {
        std::cerr << "Exception caught " << exc.what() << "\n";
    }
    catch (...)
    {
        std::cerr << "Unknown exception caught\n";
    }
}

现在您已经有了此机制,实际上可以查找错误。

查看您的代码, 可能n_cartelle元素少于4个,可能是n_cartelle.txt仅包含3行引起的。 这意味着n_cartelle[0]n_cartelle[1]n_cartelle[2]会很好,但是尝试访问n_cartelle[3]以及超出此范围的任何东西都是不确定的行为,这基本上意味着任何事情都会发生。 因此,首先要确保n_cartelle实际上具有4个元素,并且您的程序已定义了行为。

接下来可能出错的地方(老实说,很有可能是您的substr()调用)。 当您尝试使用“不可能的”参数调用substr()时,例如,使子字符串从仅包含5个字符的字符串的字符10开始,则该行为是已定义的错误 -引发std::out_of_range异常。 当您不小心尝试将负数作为substr()的第一个参数传递时,也会发生这种情况(几乎每次都是间接发生substr() 由于std::string的内部工作原理,负数将转换为巨大的正数,肯定比字符串长得多,并导致相同的std::out_of_range异常。

因此,如果您的一行内容的长度少于3个字符,则size() - 3为负数,而我刚才解释的情况就发生了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM