main ()
{
int c;
while ((c = getchar()) != EOF)
{
putchar(c);
}
}
我知道getchar()
缓冲字符。如果我执行这个程序并输入一些字符Hello
而不按回车键我按下EOF
字符为什么它Hello
再次打印并要求新字符?
当您键入“EOF”字符时,即使您没有键入换行符,终端驱动程序也会使输入缓冲区中的所有字符都可供程序使用。由于下面的代码getchar()
有一些字符,它还不是 EOF。当您键入第二个“EOF”时,没有字符要发送(但终端驱动程序让read()
函数知道有 0 个字节可用),因此read
返回 0 个字节,表示 EOF。
这是因为您的程序在输入整行之前不会接收来自 shell 的输入。直到那时它被存储在终端程序的缓冲区中。默认情况下,终端将缓冲所有信息,直到按下 ENTER,甚至在将其发送到 C 程序之前。
就像getchar
填充缓冲区然后一次“读取”一个字符putchar
一样,在打印字符时做同样的事情。要一次执行字符 I/O,您需要以无缓冲模式打开输入和输出流。但是,这可能非常低效,特别是如果程序输入和输出直接从文件或管道读取和写入时。flush
相反,尽可能使用缓冲的输入和输出,或者无论 I/O 缓冲区是否已满,只要您确实需要写入输出,就可以显式调用任何输出流。
如果您使用的是 Linux 并且可能使用 gcc,那么您必须按 ctrl+D 才能获得 EOF。当然,如果您在输入几个字符后没有按回车键,请按两次。