在c中使用getchar()时

在c中使用getchar()时,c,eof,getchar,putchar,C,Eof,Getchar,Putchar,我知道getchar()缓冲字符。如果我执行此程序并输入一些字符,如Hello,而没有按enter键,我就按了EOFcharacter,为什么它再次打印Hello,并请求新字符?当您键入“EOF”字符时,终端驱动程序使输入缓冲区中的所有字符都可供程序使用,即使你没有打新行。因为getchar()下面的代码有一些字符,所以它还没有达到EOF。当您键入第二个“EOF”时,没有要发送的字符(但是终端驱动程序让read()函数知道有0个字节可用),因此read返回0个字节,这表示EOF。这是因为您的程序

我知道
getchar()
缓冲字符。如果我执行此程序并输入一些字符,如
Hello
,而没有按enter键,我就按了
EOF
character,为什么它再次打印
Hello
,并请求新字符?

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

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

如果您使用的是Linux,可能是gcc,则必须按ctrl+D键进行EOF。当然,如果在输入几个字符后没有按enter键,请按两次

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

I pressed EOF character表示您所做的事?
EOF
,在windows中是
CTRL+Z
。在Linux中,它将是
CTRL+D
,但当我按下第一个EOF时,为什么它会像按下Enter键一样。学习:我有相同的问题-为什么我需要按两次?按下Enter或第一个EOF是为了向C提供缓冲。想象一下,如果缓冲区不是空的,那么EOF只是作为完成信号,在缓冲区中输入是完整的(它不是作为一个字符插入缓冲区)。若缓冲区是空的,那个么它就是一个字符。所以只有当你们只输入EOF而并没有输入其他字符时,程序才会退出。
main ()
{
    int c;
    while ((c = getchar()) != EOF)
    {
      putchar(c);
    }
}