getchar() 第二次调用时一直返回 EOF 值

getchar() keeps returning EOF value when called second time

我无法理解 getchar()EOF。 我正在尝试 运行 此代码:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char c;
    int a = 0; //no. of characters
    while (1) {
        c = getchar();
        if (c == EOF) {
            // printf("%i",c); 
            break;
        }
        putchar(c);
        ++a;
    }
    printf("%i", a);
    int b;
    while ((b = getchar()) != EOF) {
        putchar(b);
    }
    printf("here"); // to check wether the code written after the loop is executed
}

我按两次 Ctrl-D 终止了第一个循环,我发现很多帖子都解释了这样做的原因。但是每当我尝试在第一个循环之后调用 getchar() 函数时,它会一直返回 EOF,即使在第一个循环中的最后一次调用已经读取了它。

代码编辑器 - VSCode

OS - macOS

您必须将 c 定义为 int 以容纳 getchar() 中所有可能的 return 值,即 [=13= 类型的所有值]和特殊的负值EOF(通常定义为(-1))。

在大多数 unix 系统上,当 Ctrl-D 在终端中输入 canonical mode, whatever input has been buffered by the terminal is sent to the process. In your case, it causes the input to be echoed. If there is no such input pending, the terminal sends zero bytes to the process, which is interpreted by the OS as the end of file. Hitting Ctrl-D twice in a row, or more precisely at the beginning of a read request 时,不输入 EOF 字节,它向读取过程发出文件结束信号,因此任何进一步尝试从流中读取都将立即 return EOF,而无需从终端请求更多用户输入。