矢量下标超出范围。第1140行.C ++

时间:2013-11-12 00:30:48

标签: c++ vector outofrangeexception

我正在阅读一个文件,这是一个问题池,其中包含问题类型,章节,价值多少,问题和答案。这段代码检查最小和最大章节(来自用户输入)是否在范围内(来自未知大小的文件)。我知道它在向量的末尾添加了一个额外的行,这导致错误,但我该如何解决?代码是:

void checker(int min, int max, string file) {

        ifstream myfile;
        string line;
        vector<int> numlist;

        myfile.open(file);
        while (myfile.is_open()) {
            if (!getline(myfile, line)) {
                break;
            } else {
                vector<string> chap = split_string(line);
                int chapter = str2int(chap[2]);
                numlist.push_back(chapter); //This is where the error is. Makes vector go out of range.
            }
        }

        int small = 1000;
        int large = 0;
        for (size_t i = 0; i < numlist.size(); i++) {
            if (numlist[i] < small) {
                small = numlist[i];
            }
        }
        for (size_t i = 0; i < numlist.size(); i++) {
            if (numlist[i] > large) {
                large = numlist[i];
            }
        }
        if (min > max) {
            cout
                << "Error: Please enter a number lower than or equal to the maximum chapter: "
                << endl;
            cin >> min;
            cout << endl;
        } else if (min < small) {
            cout
                << "Error: Please enter a number bigger than or equal than the minimum chapter ("
                << small << "): " << endl;
            cin >> min;
            cout << endl;
        } else if (max > large) {
            cout
                << "Error: Please enter a number bigger than or equal than the maximum chapter ("
                << large << "): " << endl;
            cin >> max;
            cout << endl;
        }
        myfile.close();
}

2 个答案:

答案 0 :(得分:0)

它告诉你'chap'没有3个元素:

str2int(chap[2]);

如果您使用Visual Studio命中F11进入main,您应该在调试器下运行以查看查找的内容。

---编辑---

出现作为您的问题代码:

            vector<string> chap = split_string(line);
            int chapter = str2int(chap[2]);

如果split_string返回少于3个元素的向量,则为

            int chapter = str2int(chap[2]);

无效。由于执行检查的方式,在调试器外部运行可执行文件时,可执行文件会错误报告崩溃的确切位置。

您需要做的是:

std::vector<std::string> chap = split_string(line);
if(chap.size() > 2) {
    int chapter = str2int(chap[2]);
    numlist.push_back(chapter);
}

或可能

if (!line.empty()) {
    std::vector<std::string> chap = split_string(line);
    if (chap.size() > 2) {
        int chapter = str2int(chap[2]);
        numlist.push_back(chapter);
    }
}

答案 1 :(得分:0)

void checker(int min, int max, string file) {

    ifstream myfile;
    string line;
    vector<int> numlist;

    myfile.open(file);
    while (!myfile.eof()) {
        if (!getline(myfile, line)) {
            break;
        } else if(line!="") {
            vector<string> chap = split_string(line);
            int chapter = str2int(chap[2]);
            numlist.push_back(chapter);
        }
    }
//other code cut out because it was not important

我刚刚使用我的任务转入此代码并且它有效! chap [2]是读入文件中一行的第三个元素。文件中有许多行(在其他函数和类的帮助下)变成了自己的向量。但是每个向量的第三个元素(从文件读入的一行)是一个数字,它是章节编号(chap [2])。现在这证明了第2章不是罪魁祸首。 以下是文件中一行的示例: short @ 1 @ 10 @在继承中,“父”类的技术术语是什么?@base class