为什么 while((c = getchar()) != EOF) 在 c 编程中重复 2 次?

Why does while((c = getchar()) != EOF) repeat 2 times in c programming?

提问人:mert onur 提问时间:11/18/2023 最后编辑:chux - Reinstate Monicamert onur 更新时间:11/18/2023 访问量:61

问:

当我从键盘输入一个数字时,而循环会 2 次,我不明白它为什么要这样做。我想在每次输入数字后运行一次此循环。有没有人可以解释这种情况?

我的代码:

#include <stdio.h>

int main() {
    char c;
    
    while((c = getchar()) != EOF){
        printf("c = %c\n", c);
        
        int i;
        for(i = 0; i< 10; i++){
            printf("%d in loop\n", i);
        }
    }
    
    printf("%d - at EOF\n", c);
}

输出:在此处输入图像描述

我想让这个源代码真正发挥作用。

c while-loop eof getchar

评论

4赞 Joel 11/18/2023
'\n'(换行符)也是一个字符。为了阻止这种情况发生,您可以添加 while 循环条件。&& c != '\n'
5赞 Jonathan Leffler 11/18/2023
使用 ,而不是 !请参阅 while ((c = getc(file)) != EOF) 循环不会停止执行等问题。这是否真的导致了你的问题,目前还不太清楚。int cchar c
1赞 Jonathan Leffler 11/18/2023
参见 为什么提问时不应该上传代码/数据/错误的图像?
0赞 greg spears 11/18/2023
我得到的结果与你对你的代码所做的结果相同,所以它不是你的系统或编译器等。我所看到的用于解决此问题的所有方法都不可移植或不合规(调用未定义的行为)或两者兼而有之。到目前为止,我也尝试了这个评论部分的所有建议——它们都很好——但无济于事。按照这个问题...

答:

1赞 chux - Reinstate Monica 11/18/2023 #1

为什么在 C 编程中重复 2 次 (?while((c = getchar()) != EOF)

因为 OP 按下了 2 个键:和在发出文件结束信号之前。
循环对每个字符运行一次:和 。
6Enterfor'6''\n'


我想在每个输入数字后运行此循环一次。

OP 似乎希望按每个数字运行循环。
修改代码以仅在键为数字时运行循环:

if (c >= '0' || c <= '9') { // add
    for (i = 0; i< 10; i++) {
        printf("%d in loop\n", i);
    }
} // add

或使用 .if (isdigit(c)) {

如果要将输入 like 作为 1 个数字处理,然后运行循环一次,则需要额外的代码。-123Enterfor


更改为 as 通常对 256 个不同的值进行编码,并返回 257 个不同的值。@Jonathan 莱夫勒char c;int c;charint getchar()