访问冲突错误(while(info [x]!=''))

时间:2012-12-14 23:47:20

标签: c++ loops cstring

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

void main()
{
    char info[81];
    string names[5];
    double sales[5][5];
    int count = 0;
    int x = 0;
    ifstream file;
    file.open("sales.txt");

    while(!file.eof())
    {
        x = 0;
        file.getline(info, 80);
        while(info[x] != (char)39)
        {
            while(info[x] != ' ')
            {
                names[count] += info[x];
                x++;
            }
            x++;
            for(int y = 0; y < 4; y++)
            {
                sales[count][atoi(&info[x])] = (atoi(&info[x + 1]) * 10) + atoi(&info[x+2]) + (.01 *((atoi(&info[x+4])*10) + atoi(&info[x+5])));
                x += 7;
            }
            x++;
        }
        count++;
    }
}

我运行时遇到运行时错误,但我无法弄明白为什么。我不太熟悉我的编译器调试器,所以我在调试时遇到了问题。

2 个答案:

答案 0 :(得分:4)

我认为'x'超出了数组(info)界限。在再次进入循环之前,应检查x是否小于81。

例如:

while(x < 81 && info[x] != (char)39)
    {
        while(info[x] != ' ')
        {
            names[count] += info[x];
            x++;
        }
        x++;
        for(int y = 0; y < 4; y++)
        {
            sales[count][atoi(&info[x])] = (atoi(&info[x + 1]) * 10) + atoi(&info[x+2]) + (.01 *((atoi(&info[x+4])*10) + atoi(&info[x+5])));
            x += 7;
        }
        x++;
    }

无论如何,在循环内部的行中也可能发生同样的情况。您假设您的输入将具有一定长度的字符串,如果没有发生,您将再次收到该错误。


如果您尝试在空格中划分每一行,您可以考虑使用格式化输入(对于每一行):

        stringStream >> names[count];
        string theNextString;
        stringStream >> theNextString;
        // Process the theNextString, which is the string after the last space (and until the next one)

此外,这条线很容易出错。我建议你把它分成更小的部分更容易理解(并且更少依赖于线的确切长度)。您甚至可以使用格式化输入来获取数字。

sales[count][atoi(&info[x])] = (atoi(&info[x + 1]) * 10) + atoi(&info[x+2]) + (.01 *((atoi(&info[x+4])*10) + atoi(&info[x+5])));

使用格式化输入,它看起来像

int firstNumber;
stringStream >> firstNumber;

请注意,只有当您的号码以空格分隔时,上述内容才有效。

答案 1 :(得分:0)

再次检查后,我猜测它可能是你的代码的这一行:

sales[count][atoi(&info[x])] = (atoi(&info[x + 1]) * 10) + atoi(&info[x + 2]) + (.01 *((atoi(&info[x + 4]) * 10) + atoi(&info[x + 5])));

你肯定超出了info的范围并进入了其他内存位置。这很可能是造成内存访问冲突的原因。