1
#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++;
    }
}

运行此程序时出现运行时错误,但我无法弄清楚原因。我对我的编译器调试器不是很熟悉,所以我在调试时遇到了麻烦。

4

2 回答 2

4

我认为“x”超出了数组(信息)的范围。在再次进入循环之前,您应该检查 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;

请注意,仅当您的数字用空格分隔时,上述方法才有效。

于 2012-12-14T23:54:39.133 回答
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并踏入其他内存位置。这很可能是导致内存访问冲突的原因。

于 2012-12-14T23:55:01.647 回答