为什么 getchar 读取另一个值?

问题描述

我有以下来自 The C Programming Language 的代码,它返回输入的字符数

#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);
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...