наличие cout меняющего результат программы - PullRequest
2 голосов
/ 12 января 2012

Я пишу программу, которая суммирует первые десять цифр из ста 50-значных чисел в текстовом файле.Достаточно просто, и я получил правильный ответ, но я пытаюсь понять некоторые странные вещи, которые, кажется, происходят.Когда включается первая строка cout, как это показано ниже выходных данных программы:

8549904804355727945614717320-7-60-4-3-2-7-3-4-8-7-7-6-1-840-9-5-2-3-39622981389563771795892386478402037366780930326737553

Когда она заменяется комментарием справа от нее, она выводит:

97414719961102146325906539660-4-7-2-4-4-3-4-8-2-8-3-8-2-870-8-5-2-3-39622981389563771795892386478402037366780930326737553

IУ меня проблемы с пониманием
1) как то, что я вывожу, может как-то повлиять на будущие значения, которые оно выводит.
2) Как черточки попадают в программу.

Примечание. Выходными данными является сумма всех строк в обратном порядке.

char file[] = "nums.txt";
ifstream ss(file);
string iString;
string sarr[100];
int sum[100];

while(getline(ss, iString, '\n')) {
  sarr[i] = iString;
  i++;
}
ss.close();

cout << sarr[0] << endl << endl; //or cout<<(int)sarr[0][3]-48<<endl<<endl;
for(int i = 99; i >= 0; i--) {
  sum[i] = 0;
  for(int j = 0; j < 100; j++) {
    sum[i] += (int)sarr[j][i];
  }
  sum[i] -= 4800;//since 100 strings and '0' in ascii is 48 subtract 48*100
}

for(int i = 99; i > 0; i--) {
  sum[i-1] += sum[i] / 10;
  sum[i] = sum[i] % 10;
  cout << sum[i];
}
cout << sum[0] << endl << endl;

1 Ответ

9 голосов
/ 12 января 2012

Вы говорите, что первая строка вашего текстового файла - 37107287533902102798797998220837590246510135740250, что составляет 50 символов, но здесь

for(int i = 99; i >= 0; i--) {
  sum[i] = 0;
  for(int j = 0; j < 100; j++) {
    sum[i] += (int)sarr[j][i];
  }
  sum[i] -= 4800;//since 100 strings and '0' in ascii is 48 subtract 48*100
}

Вы выполняете цикл с i, переходя от 99 к 0 и используя i индексировать эту строку.Ваши индексы выходят за пределы и вызывают неопределенное поведение.Это опасность использования жестко закодированных значений вместо использования данных для определения границ цикла.

Когда случаются такие случайные вещи, и вы много работаете с массивами, первое, что вам следует сделатьискать где-то индексирование вне границ.Это, вероятно, самая частая причина UB.

...