#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++;
}
}
我运行时遇到运行时错误,但我无法弄明白为什么。我不太熟悉我的编译器调试器,所以我在调试时遇到了问题。
答案 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
的范围并进入了其他内存位置。这很可能是造成内存访问冲突的原因。