在C中正确使用scanf(),输出错误

在C中正确使用scanf(),输出错误,c,while-loop,scanf,C,While Loop,Scanf,我正试图设计一个程序,计算任意期望浮点数的平均值,直到EOF。程序还应检查输入是否正确,并在输入字符串时返回“错误输入”。我写的代码可以工作,但它给出了错误的平均输出。谁能告诉我为什么 #include <stdio.h> int main(void) { int times = 0; float sum = 0; float scan; float avrg; int scanvalue = 1; while (sca

我正试图设计一个程序,计算任意期望浮点数的平均值,直到EOF。程序还应检查输入是否正确,并在输入字符串时返回“错误输入”。我写的代码可以工作,但它给出了错误的平均输出。谁能告诉我为什么

#include <stdio.h>

int main(void) {
    int times = 0;
    float sum = 0;
    float scan;
    float avrg;
    int scanvalue = 1;       
    while (scanvalue == 1) {             
        scanvalue = scanf("%f", &scan);
        sum = sum + scan;
        times++;                
    }    
    if (scanvalue == EOF) {
        avrg = sum / times;
        printf("The average is  %f\n", avrg);
    } else {
        printf("Wrong input");
    }
    return 0;
}
#包括
内部主(空){
整数倍=0;
浮点数和=0;
浮动扫描;
浮动avrg;
int scanvalue=1;
而(scanvalue==1){
scanvalue=scanf(“%f”,&scan);
总和=总和+扫描;
时代++;
}    
如果(扫描值==EOF){
avrg=总和/次数;
printf(“平均值为%f\n”,avrg);
}否则{
printf(“错误输入”);
}
返回0;
}

致以最诚挚的问候。

scanf()
之后,您没有检查
scanvalue
,仍然使用
scan
处的值,这会弄乱平均值。请注意,当
scanf()
返回
EOF
时,它不会修改
scan
,因此它仍将具有其最后一个值,因此您要将最后一个值添加两次

但是如果您在开始时输入了无效的输入,那么行为是未定义的,请将其更改为

while ((result = scanf("%f", &value)) == 1) {
}

此外,我还特意更改了变量的名称,以说明更好的命名方法。

scanf()
之后不检查
scanvalue
,仍然使用
scan
处的值,这会弄乱平均值。请注意,当
scanf()
返回
EOF
时,它不会修改
scan
,因此它仍将具有其最后一个值,因此您要将最后一个值添加两次

但是如果您在开始时输入了无效的输入,那么行为是未定义的,请将其更改为

while ((result = scanf("%f", &value)) == 1) {
}

此外,我还特意更改了变量的名称,以说明更好的命名方式。

您需要在scanf之后检查scanvalue,否则即使输入EOF,时间也会增加,sum将得到错误的输入,从而导致平均值错误/混乱

所以你应该改变

while (scanvalue == 1) {             
    scanvalue = scanf("%f", &scan);
    sum = sum + scan;
    times++;                
}


您需要在scanf之后检查SCANWALUE,否则即使输入EOF,时间也会增加,sum将获得错误的输入,从而导致平均值错误/混乱

所以你应该改变

while (scanvalue == 1) {             
    scanvalue = scanf("%f", &scan);
    sum = sum + scan;
    times++;                
}


你能给出一个输入和输出的例子吗?我怀疑,
scanf()
的错误使用正确的输出,这当然是意外的。你的系统和编译器是什么?如果(scanvalue==EOF)EOF不一定是0。@KeineLust“如果在第一次转换之前发生输入故障(如果有),fscanf函数将返回宏EOF的值已完成。否则,该函数将返回分配的输入项的数量,如果早期匹配失败,该数量可能会少于提供的数量,甚至为零。“您能给出一个输入和输出示例吗?我怀疑
scanf()
正确输出的使用不正确,这当然出乎意料。你的系统和编译器是什么?如果(scanvalue==EOF)EOF不一定是0。@KeineLust“如果在第一次转换之前发生输入故障(如果有),fscanf函数将返回宏EOF的值已完成。否则,该函数将返回分配的输入项的数量,如果早期匹配失败,该数量可以小于提供的数量,甚至可以为零。“谢谢!但是:为什么我需要括号,而不能在此时写入(result=scanf(“%f”,&value)==1)。我以为编译器是从左到右读取这样的语句。操作员优先权。2.因为你也可以裸体上街,但你仍然穿着衣服。3.因为它成为了人类读者的模棱两可。4.因为它很难看。5.真的,因为它看起来很可怕。6.因为它看起来很糟糕,所以阅读起来很困难。但最重要的是,运算符优先级。“请注意,当
scanf()
返回
EOF
时,它不会修改
scan
”与“请注意,当
scanf()
返回的值小于1时,它不会修改
scan
”相同。然而,即使这样也不完全正确。对于罕见的输入错误,
scanf()
,可能返回
EOF
,并已更改
scan
。谢谢!但是:为什么我需要括号,而不能在此时写入(result=scanf(“%f”,&value)==1)。我以为编译器是从左到右读取这样的语句。操作员优先权。2.因为你也可以裸体上街,但你仍然穿着衣服。3.因为它成为了人类读者的模棱两可。4.因为它很难看。5.真的,因为它看起来很可怕。6.因为它看起来很糟糕,所以阅读起来很困难。但最重要的是,运算符优先级。“请注意,当
scanf()
返回
EOF
时,它不会修改
scan
”与“请注意,当
scanf()
返回的值小于1时,它不会修改
scan
”相同。然而,即使这样也不完全正确。对于罕见的输入错误,
scanf()
,可能返回
EOF
,并且已更改
scan
。如果(scanvalue!=1)中断,最好使用
While(true)
将完成这样编写的循环与在
While
循环条件下组合赋值和测试相比是笨拙的。这不是惯用的C语言。如果(scanvalue!=1)break,最好使用
While(true)
将完成这样编写的循环与在
While
循环条件下组合赋值和测试相比是笨拙的。这不是惯用的C。