使用 getchar() 计算用户输入的数量给出了预期结果的两倍,为什么?

Counting number of user input using getchar() gives double the expected result, why?

在下面的例子中,来自"C programming"一本书,当输入字符时,程序计数两次。

main(){

long nc;

nc = 0;
while (getchar() != EOF)
    ++nc;
    printf("%ld\n", nc);
}

输出:

a
b
c
d
e
f
12

怎么了?

我正在使用 Ubuntu 和 gcc 编译器。

计数正常。 getchar() 正在考虑按 ENTER 键,作为换行符 \n。所以 6 user 输入和 6 个换行符。计数匹配。

如果你不希望换行被计为输入,你需要在getchar() return值不是时增加计数器\n,类似于

while ( (c = getchar()) != EOF) {
    if  ( c != '\n')  ++nc;
    }

会完成任务的。注意,c 应该是 int 类型才能处理 EOF.

也就是说,根据 C99C11,对于托管环境,main() 的签名至少应为 int main(void) 以符合标准。