-2

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

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();
}
4

2 回答 2

0

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

str2int(chap[2]);

如果您使用 Visual Studio 按 F11 进入主程序,您应该在调试器下运行以查看 chap 的样子。

- - 编辑 - -

似乎是您的问题代码:

            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);
    }
}
于 2013-11-12T01:20:15.997 回答
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])。现在这证明 chap[2]不是罪魁祸首。以下是文件中一行的示例: short@1@10@在继承中,“父”类的技术术语是什么?@基类

于 2013-11-13T05:02:08.327 回答