2017-01-22 13 views
1

Бит путают с текущим кодом. Обучение в Uni и в настоящее время проходит через Язык программирования C (второе издание) Брайан У. КерниганПытается распечатать возврат getchar()! = EOF всех введенных символов

Теперь я программировал в течение многих лет, в основном в C++ и немного Java, однако на самом деле не играли с C так много, и что-то действительно меня беспокоит.

Так упражнения 1-6 в книге вы хотите доказать, что символ читаться getchar() будет либо 1 или 0

Теперь я полностью понимаю, что он читает символ в буфере и проверяет, чтобы увидеть, если это не EOF, если так оно возвращает 1 еще 0

Это означает, что если я типа a и нажмите клавишу ВВОД он читает a и ввода и возвращает 1,1 Кроме того, если я использую CTRL+D возвращается 0, потому что он вызывает EOF. Проблема у меня есть, и где я не в состоянии понять логику: когда я типа aa Ctrl+D, , как я прочитал это должно напечатать 1,1,0, как он читает a,a затем EOF, однако, кажется, печатать 1,1 затем ждать следующего входа.

Почему это?

Вот код, который я написал до сих пор.

#include <stdio.h> 

main() 
{ 
    int c; 

    while(c = (getchar() != EOF)) // Read char in buffer and check to see if it's EOF or not, then assign a 1 or 0 to c 
    { 
     printf("1 Not End Of File\n"); 
    } 
    printf("0 End Of File\n"); 
} 

Очевидно, что я мог бы использовать printf("%d",c);, чтобы показать, если его 1 или 0, но вопрос до сих пор стоит ..

Почему, когда я aa ctrl+D это не печатает

1 Not End Of File 
1 Not End Of File 
0 End Of File? 

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

Это, кажется, читает два a «S, а затем вместо того, чтобы установить c0, когда он должен достичь CTRL+D, а затем выйти из времени, кажется, сидеть и ждать больше ввода?

+2

Возможно, вы столкнулись с некоторыми проблемами, связанными с терминальным входом, и вообще не связаны с вашим кодом C. Попробуйте сравнить эти три эксперимента: (1) «a RETURN CTRL + D», (2) «a CTRL + D», (3) «a CTRL + D CTRL + D». –

+0

Вы видите, что я думал. Я проверил все три эксперимента, 1) возвращает 1,1,1, затем ждет ввода и ctrl + d, тогда выходы 0 ... 2) возвращает 1,1, а затем ждет ввода.3) возвращает 1,1 ожидания ввода, затем 0 –

+0

Это ожидаемый результат, и это согласуется с ответом Shiping. Драйвер терминала Unix/Linux накапливает символы и не доставляет их в вашу программу до тех пор, пока (a) вы не нажмете Return или (b) не нажмете Control-D. Кроме того, если он находится в начале строки (то есть, если ей предшествует новая строка), control-D генерирует EOF. –

ответ

0

Я думаю, что Ctl-D предназначен для запуска программы для чтения ввода. Поскольку вы набрали несколько символов, программа должна прочитать что-то и не видит конца ввода. Тип Ctl-D один, программа пытается прочитать ввод, но ничего не видит и воспринимает его как достигнутый до конца ввода. Как добавить, что Ctl-D сам не передается getchar() для чтения в качестве входных данных.

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

  • Нет связанных вопросов^_^