为什么 getchar 正在读取一个值?

Why getchar is reading one more value?

我从 The C Programming Language 中获得了以下代码,return 键入的字符数

#include <stdio.h>
/* count characters in input; 1st version */
main() {
    long nc;
    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
}

但是,当我在 Windows 的命令提示符中执行我的程序 (charcounter.exe) 并输入一系列字符时,程序会再打印一个。就像下面的例子

C:\...\c-folder>charcounter
abc
^Z
4

为什么会这样?我想可能是因为我按下了 ENTER,但是当我尝试键入整个序列,然后按 Ctrl + Z,然后再按 ENTER 时,程序不会读取 EOF 字符并继续等待另一个字符。

C:\Users\juani\Desktop\c-folder>charcounter
abc^Z
^Z
4

稍微总结一下 Ctrl-Z 只有在行首时才表现得像 EOF,如果它在其他地方,则该行中从 ^Z 开始的所有字符都会被忽略,其中包括 \n,例如,对于 abcdctrl-zasdEnter,该行只计算了4个字符。

剩下的就是你说的,\n也是一个字符,所以它被计算在内,你总是可以排除它被计算在一个条件下,如果这是一个选项:

int main()
{
    long nc;
    nc = 0;
    int c;
    while ((c = getchar()) != EOF)
        if (c != '\n')
            ++nc;
    printf("%ld\n", nc);
}