#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++;
}
}
Я получаю ошибку во время выполнения, когда я запускаю это, но я не могу понять, почему именно. Я не очень знаком с моим отладчиком компиляторов, поэтому у меня возникли проблемы с отладкой.
Я думаю, что «х» превышает границы массива (информация). Вы должны проверить, что х меньше 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;
Обратите внимание, что вышесказанное будет работать только в том случае, если ваши номера разделены пробелами.
После проверки еще раз, я предполагаю, что это, вероятно, эта строка вашего кода:
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
и заходя в какую-то другую область памяти. Это наиболее вероятно, что вызывает нарушение доступа к памяти.