2016-01-22 4 views
1

Я пытаюсь прочитать целое число с помощью getchar(). Это код, я использую:Чтение целых чисел с getchar()

while (thisChar = getchar() != '\n') { 
    n = n * 10 + thisChar - '0'; 
} 

int n инициализируется нулем и thisChar объявлен как int

Для одного ввода цифры, п возвращается в -47, что означает значение символа для start of heading читается первым. Есть ли что-то неправильное в отношении того, как я назначаю thisChar в выражении while?

ответ

5

Это недостающие скобки:

int thisChar; 
while ((thisChar = getchar()) != '\n') { 
    n = n * 10 + thisChar - '0'; 
} 

Без этих дополнительных скобок, вы всегда присвоить thisChar значение сравнения getchar() != '\n', т.е. всегда 1 или 0 ...

Обратите внимание, что вы также должны обращаться EOF:

int thisChar = getchar(); 
while (thisChar != EOF && thisChar != '\n') { 
    n = n * 10 + thisChar - '0'; 
    thisChar = getchar(); 
} 
+0

Upvote. 'thisChar - '0'' может быть' 1 - 48', что объясняет OP '-47' для одной цифры. –

+0

@WeatherVane, если thischar имеет тип 'int', что нужно использовать' - '0' '? – roottraveller

+0

@ rkm_Hodor, потому что он читает числовые символы ''0' .. '9'', которые не имеют этого * значения *. Поэтому вы вычитаете ''0'' для получения целочисленного диапазона' 0..9'. В ASCII (который является общим, но не всегда используется), числовые символы ''0' .. '9'' имеют значения' 48..57'. –

3

!= имеют привет чем у оператора =. Поэтому выражение

while(thisChar = getchar() != '\n') {...} 

будет разобрано как

while(thisChar = (getchar() != '\n')) {...} 

и результат сравнения getchar() != '\n') будет назначен thisChar.

Вы должны поместить подвыражение thisChar = getchar() внутри кронштейна

while((thisChar = getchar()) != '\n') {...} 
+1

Правильно, за исключением того, что существует только один оператор присваивания, поэтому его ассоциативность не имеет значения. Проблема в том, что '! =' Имеет более высокий приоритет, чем '='. –

+0

@KeithThompson; Простите за это. Я исправил это сейчас. – haccks