2017-02-07 3 views
3

Я пытался решить проблему 1.6 в K & R. вопрос -с = (! GetChar() = EOF)

  • Убедитесь, что выражение getchar() != EOF является 0 или 1.

Я нашел решение, которое работает:

#include <stdio.h> 

int main(){ 
    int expr_val, c; 
    printf("Input a character and press enter: "); 
    expr_val = (getchar() != EOF); 
    printf("expr_val: %d\n", expr_val); 

    return 0; 
} 

Когда я печатаю в чем-либо, он возвращает значение 1. Когда я execut e a EOF (Ctrl + D), он возвращает значение 0.

Однако, когда я заменяю EOF в коде цифрой, скажем 3, программа не работает так, как я ожидаю. Если я набираю слово «5», он возвращает значение 1. Если я ввожу значение «3», оно также возвращает значение 1.

По моему мнению, ввод значения 3 должен возвращать значение, которое отличается от значения, я получаю, если я типа в значение 5.

(я только изменил EOF в 3)

#include <stdio.h> 

int main(){ 
    int expr_val, c; 
    printf("Input a character and press enter: "); 
    expr_val = (getchar() != 3); 
    printf("expr_val: %d\n", expr_val); 

    return 0; 
} 

Может кто-нибудь просветить меня о том, почему это так?


Спасибо всем, ваши ответы были очень ясными и полезными. Изменив EOF на «3» или 51, код работал правильно.

+8

'3' и' '3'' отличаются.Дополнительную информацию см. В [ASCII-таблице] (http://www.asciitable.com/). –

+2

'expr_val = (getchar()! = 'A');' и type'A'. – chux

+2

Вопрос K & R немного глуп, по крайней мере, по отношению к стандарту C. Результат любой реляционной операции (например, выполняемой оператором '! =') Равен 0 или 1 по определению. –

ответ

2

Вы путаете целое число и характер.

3 не символ 3, а целое число. '3' является символом 3 в C.

Документация here.

3

getchar() Функция возвращает символ, считанный как unsigned char, переданный в int или EOF в конце файла или ошибки.

Итак, вам просто нужно изменить сравнение и использовать '3' (символ «3») вместо 3 или вы можете использовать значение ASCII из цифр 3 которая 51. [см ASCII Table]

expr_val = (getchar() != '3'); 

или

expr_val = (getchar() != 51); 

в настоящее время в обоих случаях вы получите expr_val = 0 если вы наберете 3 в качестве входных данных.

+0

C не гарантирует использование ASCII, поэтому 'expr_val = (getchar()! = 51);' неверно. И магическое число - плохая практика. – Stargateur

+0

Согласен, в таком случае вы хотите предложить любую альтернативу? –

+2

Почему вы хотите альтернативу? '' 3'' достаточно. – Stargateur

-1

никто не объяснил, как преобразовать '3' в 3. Вы можете использовать atoihttps://linux.die.net/man/3/atoi или один из его двоюродных братьев

+2

'atoi' преобразует строки с нулевым символом. '' 3'' будет преобразован в '3' путем вычитания' '0''. И OP не нужно делать это преобразование в любом случае. –

0

(GetChar()! = 3) является логическое выражение. Учитывая это, ваш код будет присваивать 0 или 1 только expr_val

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