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