【问题标题】:getchar() != EOFgetchar() != EOF
【发布时间】:2014-11-28 07:29:34
【问题描述】:

我正在运行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'} 时,我会在屏幕上打印以下响应:hello,但程序并没有退出。一旦我输入^D,它不应该退出吗?我必须再次输入^D 才能退出程序。或者程序仅在我在\n 之后输入^D 后退出。我不明白为什么无论我输入^D,程序都不会退出。有什么想法吗?

我在 UNIX 系统上运行。

【问题讨论】:

    标签: c getchar putchar


    【解决方案1】:

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

    【讨论】:

    • 请注意,这是操作系统输入流的属性,而不是 C 程序的属性。
    • 谢谢你,玛丽安和马特麦克纳布。我认为输入缓冲区只能通过输入换行符来刷新。我不知道 ^D 也有类似的行为。
    猜你喜欢
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多