getchar()!= EOF

时间:2014-11-28 07:29:34

标签: c getchar putchar

我正在运行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系统上运行。

1 个答案:

答案 0 :(得分:18)

当您键入^ D(&#39;传输结束&#39;)时,刷新输入缓冲区,并将您输入的所有内容发送到您的程序(不实际发送^ D字符)。它类似于键入换行符,但在这种情况下,也会发送换行符本身。程序在读取零个字符时将其输入视为已关闭。当您键入换行符后跟^ D或连续两次^ D时会发生这种情况。