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