Позволяет протестировать эту программу с различными входами и позволяет наблюдать за поведением.прежде чем мы продолжим, давайте также включим оператор 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
$