Ошибка нарушения доступа в (while (info [x]! = »))

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

Я получаю ошибку во время выполнения, когда я запускаю это, но я не могу понять, почему именно. Я не очень знаком с моим отладчиком компиляторов, поэтому у меня возникли проблемы с отладкой.

1

Решение

Я думаю, что «х» превышает границы массива (информация). Вы должны проверить, что х меньше 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;

Обратите внимание, что вышесказанное будет работать только в том случае, если ваши номера разделены пробелами.

4

Другие решения

После проверки еще раз, я предполагаю, что это, вероятно, эта строка вашего кода:

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и заходя в какую-то другую область памяти. Это наиболее вероятно, что вызывает нарушение доступа к памяти.

0

По вопросам рекламы [email protected]