Это верно почти для каждого драйвера терминала. Вы получите то же самое поведение, используя Linux.
Ваша программа фактически не выполняет цикл до тех пор, пока вы не введете \n
или ^z
в конце строки. Драйвер терминала буферизует входные данные, и они не были отправлены вашему процессу, пока это не произойдет.
В конце строки нажатие ^z
(или ^d
в Linux) не заставляет драйвер терминала отправлять EOF. Он только сбрасывает буфер в ваш процесс (без \n
).
Нажатие ^z
(или ^d
в Linux) в начале строки интерпретируется терминалом как «Я хочу сигнализировать EOF».
Вы можете наблюдать это поведение, если добавите в свой цикл следующее:
printf("%d\n",ch);
Запустите вашу программу:
$ ./test
abc <- type "abc" and hit "enter"
97
98
99
10
abc97 <- type "abc" and hit "^z"
98
99
Чтобы лучше понять это, вы должны понять, что EOF - это не персонаж. ^z
- это пользовательская команда для самого терминала . Поскольку терминал отвечает за принятие пользовательского ввода и передачу его процессам, это становится хитрым и, следовательно, путаницей.
Чтобы увидеть это, нажмите ^v
, затем нажмите ^z
в качестве ввода в вашу программу.
^v
- это еще одна команда терминала, которая сообщает терминалу: «Эй, следующее, что я набираю - не интерпретируйте это как команду терминала; вместо этого передайте ее на вход процесса».