当我到达我的2D阵列时为什么会崩溃?超出范围

时间:2015-02-06 23:22:11

标签: c++ outofrangeexception

#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <stdlib.h>

using namespace std;

int gradeExam(string answerKeyARR[]);


int main()
{
    const int QUESTIONS = 10;
    const int MAX_STUDENTS = 250;

    ifstream inFile;
    ofstream outFile;
    inFile.open("grade_data.txt");
    outFile.open("grade_report.txt");

    string ansKey;
    inFile >> ansKey;

    string answerKeyARR[QUESTIONS];

//Loop for storing each answer into an array rather than all in a single string.
    for (int j = 0; j < QUESTIONS; j++)
    {
        answerKeyARR[j] = ansKey.substr(j,1);
    }

    int i = 0;
    int numStudents = 0;
    string studentAnswers[MAX_STUDENTS];

//Loop to read in all answers into array and count number of students.
    while (!inFile.eof())
    {
        inFile >> studentAnswers[i];
        numStudents++;
        i++;
    }

//WHY DOES IT CRASH HERE?!
    string studentAnswersARR[numStudents][QUESTIONS];

    for (int k = 0; k < numStudents; k++)
    {
        for (int l = 0; l < QUESTIONS; l++)
        {
            studentAnswersARR[k][l] = studentAnswers[l].substr(l,1);
cout << studentAnswersARR[k][l];
        }
    }

    inFile.close();
    outFile.close();
    return 0;
}

好的,所以基本上一旦它到达了删除子串的部分,它就会崩溃。它可以很好地检索答案键答案,那么为什么到达这一点时它会崩溃呢?这仍然是基本编码2的WIP。 另外,当我改变变量&#39; l&#39;比如说位置0,它有效。是什么给了什么?

1 个答案:

答案 0 :(得分:0)

您的代码存在多个问题,可能会导致问题。

首先,您的输入循环没有正确限制。它应该停在MAX_STUDENTS,但您无法检查此限制。

其次,不要使用eof()来检查文件的结尾。 SO上有很多帖子在讨论这个问题。

while (!inFile && i < MAX_STUDENTS)
{
    inFile >> studentAnswers[i];
    numStudents++;
    i++;
}

下一个问题是您在问题中突出显示的行。由于堆栈空间耗尽,可能崩溃。但是你所拥有的代码使用的是非标准的C ++扩展,一旦你这样做了,那么关于该行在内部真正做什么的规则取决于编译器供应商。

因此,为了通过使用标准C ++来缓解这种情况,可以执行以下操作:

#include <vector>
#include <string>
#include <array>
//...
    std::vector<std::array<std::string, QUESTIONS> > 
                               studentAnswersARR(numStudents);