2014-11-28 6 views
5

Я бег следующей программы из языка программирования C книги:GetChar() = EOF

#include <stdio.h> 
main() 
{ 
    int c; 
    while((c=getchar()) != EOF) 
    putchar(); 
} 

Когда я запускаю эту программу, я получаю необъяснимое поведение. Если я вводим символы из командной строки в следующей последовательности: {'h', 'e', 'l', 'l', 'o', '\n', '^D'}, тогда я получаю следующий ответ, напечатанный на экране: hello, после ввода \n, и программа завершает работу после ввода ^D.

Однако, когда я меняю последовательность следующим образом: {'h', 'e', 'l', 'l', 'o', '^D'}, тогда я получаю следующий отклик на экран: hello, но программа не уходит. Разве он не должен уходить после ввода ^D? Я должен ввести ^D второй раз для выхода программы. ИЛИ программа заканчивается только после того, как я ввел ^D после \n. Я не понимаю, почему программа не выходит, когда я вхожу ^D. Есть предположения?

Я бегу по системе UNIX.

ответ

17

Когда вы набираете^D («конец передачи»), буфер ввода сбрасывается, и все, что вы вводили до сих пор, отправляется в вашу программу (без фактической отправки символа D). Это похоже на ввод символа новой строки, однако в этом случае сам символ новой строки также отправляется. Программа считает свой ввод закрытым, когда он считывает нулевые символы. Это происходит, когда вы печатаете новую строку, а затем - D или два последовательных^D.

+3

Обратите внимание, что это свойство входного потока операционной системы, а не программы C. –

+0

Спасибо, Мариан и Мэтт Макнабб. Я думал, что входной буфер очищается только путем ввода символа новой строки. Я также не знал о подобном поведении с^D. – Nishi

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