0
main ()
{
    int c;
    while ((c = getchar()) != EOF)
    {
      putchar(c);
    }
}

我知道getchar()缓冲字符。如果我执行这个程序并输入一些字符Hello而不按回车键我按下EOF字符为什么它Hello再次打印并要求新字符?

4

4 回答 4

4

当您键入“EOF”字符时,即使您没有键入换行符,终端驱动程序也会使输入缓冲区中的所有字符都可供程序使用。由于下面的代码getchar()有一些字符,它还不是 EOF。当您键入第二个“EOF”时,没有字符要发送(但终端驱动程序让read()函数知道有 0 个字节可用),因此read返回 0 个字节,表示 EOF。

于 2014-01-09T05:34:13.247 回答
2

这是因为您的程序在输入整行之前不会接收来自 shell 的输入。直到那时它被存储在终端程序的缓冲区中。默认情况下,终端将缓冲所有信息,直到按下 ENTER,甚至在将其发送到 C 程序之前。

于 2014-01-09T05:34:20.900 回答
1

就像getchar填充缓冲区然后一次“读取”一个字符putchar一样,在打印字符时做同样的事情。要一次执行字符 I/O,您需要以无缓冲模式打开输入和输出流。但是,这可能非常低效,特别是如果程序输入和输出直接从文件或管道读取和写入时。flush相反,尽可能使用缓冲的输入和输出,或者无论 I/O 缓冲区是否已满,只要您确实需要写入输出,就可以显式调用任何输出流。

于 2014-01-09T05:39:44.830 回答
0

如果您使用的是 Linux 并且可能使用 gcc,那么您必须按 ctrl+D 才能获得 EOF。当然,如果您在输入几个字符后没有按回车键,请按两次。

于 2014-01-09T05:36:40.320 回答