Объясните результат моего C-кода.K & R "The C Prog language" Ex1-6 - PullRequest
0 голосов
/ 30 сентября 2018

Pl ref на мой ответ на вопрос 1-6 K & R. Убедитесь, что выражение getchar ()! = EOF равно 0 или 1

#include <stdio.h>
int main()
{
    int c;
    int result;
    result=((c=getchar())!=EOF);
    while(result)
    {
        printf("\nValue of the exp %s\t is %d\n","getchar()!=EOF",result);
        putchar(c);
        result=((c=getchar())!=EOF);
    }
    printf("\nValue of the exp %s\t is %d\n","getchar()!=EOF",result);
}

Теперь, пожалуйста, посмотрите вывод ниже, когда я введу char 'w 'в первый раз и' Ctrl-D 'во второй раз.

w

Value of the exp getchar()!=EOF  is 1
w
Value of the exp getchar()!=EOF  is 1

^D

Value of the exp getchar()!=EOF  is 0

Почему строка

Value of the exp getchar()!=EOF is 1

повторяется дважды?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Позволяет протестировать эту программу с различными входами и позволяет наблюдать за поведением.прежде чем мы продолжим, давайте также включим оператор printf, чтобы мы могли понять, что именно читается getchar()

Теперь я изменю программу следующим образом

    printf("\nValue of the exp %s\t is %d\n","getchar()!=EOF",result);
    putchar(c);
    printf("%d %d\n", c, c); // This should tell us what is being read
    result=((c=getchar())!=EOF);

Далее aнемного ручного материала на getchar

читает следующий символ из потока и возвращает его как символ без знака, приведенный к типу int

Это означает из stdin getchar читает побайтово, пока не встретит '\n' или EOF, а именно -1.

Теперь можно приступить к тестированию:

Тест 1: The usual input out put scenarios with 'W' and ctrl+D

W

Value of the exp getchar()!=EOF  is 1
W87 87

Value of the exp getchar()!=EOF  is 1

10 10

Value of the exp getchar()!=EOF  is 0

в этом случае содержимое в stdin равно 'W\n', поэтому первое getchar читает W, а затем второе getchar читает '\n', а третье getchar читает ctrl+d который в конечном итоге отправляет EOD для завершения.

Тест 2: Lets put these in a file and provide that as input to executable

$ echo "W" > infile
$ cat infile
W
$

Обратите внимание, что когда мы выполняем cat infile, приглашение отправляетсяк следующей строке, что означает, что входные данные все еще содержат '\ n', в конечном итоге означает, что не должно быть большого изменения в выходных данных по сравнению с предыдущимислучай США.

пробег должен доказать это

$ ./a.out < infile

Value of the exp getchar()!=EOF  is 1
W87 87

Value of the exp getchar()!=EOF  is 1

10 10

Value of the exp getchar()!=EOF  is 0
$

Тест 3: get rid of the new - line

к настоящему времени мы достаточно уверены, что виновник'\n', в linux есть альтернатива echo, называемая printf, которая делает что-то похожее на echo, за исключением того, что без последующей следующей строки мы можем использовать ее для создания входного файла без следующей строки.

$ printf "W" > infile_wo_NL
$ cat infile_wo_NL
W$

обратите внимание, что '\n' нет, поэтому это должно избавить от второй строки в выводе.

$ ./a.out < infile_wo_NL
Value of the exp getchar()!=EOF  is 1
W87 87

Value of the exp getchar()!=EOF  is 0
$
0 голосов
/ 30 сентября 2018

Почему строка Value of the exp getchar()!=EOF is 1 повторяется дважды?

Потому что, если вы вводите w[Enter] один getchar() читает 'w', а следующий читает '\n'.

...