我正在运行C Programming Language本书中的以下程序:
#include <stdio.h>
main()
{
int c;
while((c=getchar()) != EOF)
putchar();
}
或者
#include<stdio.h>
int main(){
int c = getchar();
while(c != EOF){
putchar(c);
c = getchar();
}
}
当我运行这个程序时,我得到一个无法解释的行为。如果我按以下顺序从命令行输入字符:{'h', 'e', 'l', 'l', 'o', '\n', '^D'}
然后在输入hello
后,我将以下响应打印到屏幕:\n
,程序退出^D
{'h', 'e', 'l', 'l', 'o', '^D'}
1}}输入。
但是,当我按如下方式更改序列时:hello
然后我将以下响应打印到屏幕:^D
,但程序不会退出。我输入^D
后不应该退出吗?我必须第二次输入^D
才能退出该计划。或者该程序仅在我\n
之后输入^D
后退出。我无法理解为什么无论何时进入{{1}},该计划都不会退出。有什么想法吗?
我在UNIX系统上运行。
答案 0 :(得分:18)
当您键入^ D(&#39;传输结束&#39;)时,刷新输入缓冲区,并将您输入的所有内容发送到您的程序(不实际发送^ D字符)。它类似于键入换行符,但在这种情况下,也会发送换行符本身。程序在读取零个字符时将其输入视为已关闭。当您键入换行符后跟^ D或连续两次^ D时会发生这种情况。