2012-01-12 7 views
1

Я пишу программу, которая суммирует первые десять цифр из ста пятидесятизначных чисел, которые находятся в текстовом файле. Достаточно легко, и я получил правильный ответ, но я пытаюсь понять некоторые странные вещи, которые, похоже, продолжаются. Когда первая соиЬ линия включена, как она появляется ниже результатов программы:наличие 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 

У меня возникли проблемы понимание
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; 
+0

Какая линия cout вы меняете, чтобы быть комментарием? Их три. –

+1

Что вы пытаетесь сделать с этим sarr [0] [3] - 48 ... некоторые комментарии сделают вашу программу более читаемой. –

+0

Есть пара «endl's» между первым и вторым cout. Вы опустили первую строку вывода или смяли две строки вместе? –

ответ

8

Вы говорите, что первая строка текстового файла является 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.

+0

wow невероятный спасибо. Итак, теперь, когда я знаю, что это такая глупая ошибка, я должен удалить этот пост или оставить его в недоступном случае, кому-то это будет полезно? – emschorsch

+2

@emschorsch Я бы оставил это, это совершенно правильный вопрос. Кроме того, он может напомнить кому-то в будущем «проверить еще раз» за выход за пределы. –

Смежные вопросы