Что-то здесь буферизовано. например stdout FILE *, в который пишет putchar, может быть line.buffered. Когда программа завершится (или встретит новую строку), такой ФАЙЛ * будет fflush () 'и вы увидите вывод.
В некоторых случаях фактический терминал, который вы просматриваете, может буферизовать вывод до новой строки или до тех пор, пока сам терминал не получит команду очистить свой буфер, что может быть в случае, когда текущая программа переднего плана завершает работу, так как она хочет представить новое приглашение.
Теперь, что, вероятно, является реальным случаем здесь, это то, что это вход, который буферизуется (в дополнение к выводу :-)) Когда вы нажимаете клавиши, он появляется в окне вашего терминала. Однако терминал не будет отправлять эти символы в ваше приложение, он будет буферизовать их до тех пор, пока вы не укажете, что это конец ввода с Ctrl + D и, возможно, также новая строка.
Вот еще одна версия, чтобы поиграть и задуматься:
int main() {
int c;
while((c = getchar()) != EOF) {
if(c != '\n')
putchar(c);
}
return 0;
}
Попробуйте ввести предложение в вашу программу и нажмите Enter. И сделайте то же самое, если вы закомментируете
if (c! = '\ n') Может быть, вы можете определить, буферизуются ли ваш вход, выход или оба.
Это становится более интересным, если вы запустите выше, как:
./mytest | ./mytest
(В качестве дополнительного комментария обратите внимание, что CTRD + D не является символом и не является EOF. Но в некоторых системах это приведет к закрытию входного потока, что снова повысит EOF для любого, кто пытается прочитать из потока.)