5

我正在运行C 编程语言书中的以下程序:

#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'}然后我得到以下响应打印到 screen: hello,但程序没有退出。一旦我进入,它不应该退出^D吗?我必须^D第二次进入程序才能退出。或者程序只有在我输入^D以下内容后才会退出\n。我不明白为什么无论我什么时候进入程序都不会退出^D。有什么想法吗?

我在 UNIX 系统上运行。

4

1 回答 1

18

当您键入 ^D('end-of-transmission')时,输入缓冲区将被刷新,并且您到目前为止键入的所有内容都将发送到您的程序(实际上没有发送 ^D 字符)。它类似于键入换行符,但是,在这种情况下,也发送换行符本身。程序在读取零个字符时认为其输入已关闭。当您键入换行符后跟 ^D 或两个连续的 ^D 时,就会发生这种情况。

于 2014-11-28T07:41:12.420 回答