Терминал иногда может немного сбивать с толку. Вы должны изменить свою программу на:
#include <stdio.h>
int main() {
int read;
while ((read = getchar()) != EOF) {
putchar(read);
}
return 0;
}
Это будет читаться до тех пор, пока getchar не прочитает EOF (в большинстве случаев этот макрос расширяется до -1) с терминала. getchar возвращает int, поэтому вы должны преобразовать свою переменную в целое число, чтобы вы могли проверить наличие EOF. Вы можете отправить EOF со своего терминала в Linux с помощью ^D и, я думаю, в Windows с помощью ^Z (?).
Чтобы немного объяснить, что происходит. В вашей программе выражение
(read = getchar()) !='\n'
будет истинным до тех пор, пока из буфера не будет прочитано '\n'. Проблема в том, чтобы получить буфер для вашей программы, вы должны нажать Enter, что соответствует '\n'. Следующие шаги происходят, когда ваша программа вызывается в терминале:
~$\a.out
это запускает вашу программу
(empty line)
getchar() сделал системный вызов, чтобы получить ввод от терминала, и терминал берет на себя
f
вы сделали ввод в терминале. 'f' записывается в буфер и выводится обратно на терминал, ваша программа еще не знает о символе.
f
f~$
Вы нажимаете ввод. Ваш буфер теперь содержит 'f\n'. «Ввод» также сигнализирует терминалу, что он должен вернуться в вашу программу. Ваша программа читает буфер, находит f и выводит его на экран, а затем находит '\n' и немедленно останавливает цикл и завершает вашу программу.
Это было бы стандартным поведением большинства терминалов. Вы можете изменить это поведение, но это будет зависеть от вашей ОС.
person
Lucas
schedule
17.03.2010