2015-12-04 3 views
2

Я написал функцию, предназначенную для чтения любых целых чисел из входного файла, найти сумму этих чисел и найти общее количество чисел (которое я получил). Вот он:Ошибка при добавлении значений, полученных от fgetc?

int total = 0; 
int ncount = 0; 
int cse; 
do 
{ 
    cse = fgetc(infp); 
    if(cse <= '9' && cse >= '0') 
    { 
     total += cse; 
     ncount++; 
    } 
}while(cse != EOF); 

fprintf(outp,"Number of numbers is %d\n", ncount); 
fprintf(outp, "Total is %c\n", total); 

Если я поставил 78345, который должен быть равен total = 27; Я получаю total = 267. Аналогично, если я просто печатаю значения fgetc, я получаю числа как 53 54 57 и т. Д. Однако, когда я печатаю их, используя% c, я получаю 78345. Как я могу использовать эту логику для добавления этих значений в виде суммы? Заранее спасибо!

+0

'если (CSE <= '9' && CSE> = '0')' какой-либо причине не только с помощью 'isdigit'? Или, по крайней мере, реструктурировать, чтобы яснее понять, что вы имеете в виду? И вы не считаете _integers_, а _digits_. – Olaf

+0

'fprintf (outp,« Total is% c \ n », total);' должно быть с '% d' – pzaenger

+0

Вы используете'% c' вместо '% d' для печати всего. – Quentin

ответ

2

fgetc возвращает один символ, который не эквивалентен цифровому значению символов. В вашем коде вы сравниваете и добавляете значения символьного кода.

Вам нужно преобразовать код символа в целое с чем-то вроде:

int num = cse - '0'; 
+0

Спасибо, что сработало отлично !! – riomss

2

два вопроса:

  • total += cse; должен быть total += (cse - '0');
  • fprintf(outp, "Total is %c\n", total); должен быть fprintf(outp, "Total is %d\n", total);
+0

Эти проблемы решены и моими проблемами, я очень ценю это! – riomss

3

Две вещи. Во-первых, вы добавляете значение ASCII символов, а не то, что символ представляет:

total += cse; 

Вы можете вычесть значение символа нуля от того, как едва простого преобразования:

total += cse - '0'; 

Тогда, во-вторых, вы печатаете значение символа:

fprintf(outp, "Total is %c\n", total); 

Используйте целое форматировщик как %d.

+0

Спасибо за помощь, это решение сработало. – riomss

+0

Рад помочь @McQueen и добро пожаловать в StackOverflow :-) – sidyll

1

ваши символы чтения, рассматривая их как числа.

Ну, «0» это символ, который имеет значение ASCii из 48.

Но что вы на самом деле, кажется, хотят, чтобы использовать номер 0.

Правильный способ преобразования является

int total = 0; 
int cse; 

while(cse = fgetc(stdin) && EOF != cse) 
{ 
    total += (cse - '0'); 
}