2017-02-22 72 views
0

我试图设计出计算花车的任意数量的平均值,直到EOF的程序。程序还应该检查输入是否正确,并在例如返回“错误输入”时返回。输入一个字符串。我编写的代码有效,但它给出的平均值是错误的。谁能告诉我为什么?正确使用用C的scanf()的,错误的输出

#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

你能举一个例子输入和输出? – Marievi

+0

我会怀疑,*不正确的使用scanf()的'正确的输出*'的这又是当然的** **意外。 –

+0

你的系统和编译器是什么?你打算结束输入的关键是什么? –

回答

4

你不检查scanvaluescanf()仍然使用的价值在scan这是搞乱了平均水平。请注意,当scanf()回报EOF它不会修改scan,因此仍然有其最后的值,这样你就两次把最后的价值。

但是,如果你一开始就进入无效输入,则行为是不确定的,将其更改为

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

而且,我特意改变了你的变量的名字来说明它们命名一个更好的方式。

+0

谢谢!但是:为什么我需要内部的括号并且不能只写while(result = scanf(“%f”,&value)== 1)。我认为编译器正在从左到右地阅读这些语句。 – Mark

+1

1.操作员优先。 2.因为你也可以赤裸上街,但你仍然穿着衣服。 3.因为它对于读者来说变得模糊不清。 4.因为它很丑。真的,因为它看起来很可怕。 6.因为它看起来很糟糕,所以阅读起来很困难。但最支持的是,运营商优先。 –

+0

“注意当'scanf()'返回'EOF'时,它不会修改'scan'”更好,因为“请注意,当scanf()返回小于1时,它不会修改'scan'”。但即使这样也不完全正确。在罕见的输入错误时,'scanf()'可能会返回'EOF'并改变'scan'。 – chux

0

您需要scanf函数后检查scanvalue,即使你输入EOF和金额会得到一个错误输入,否则时间将增加,从而导致平均为错误/搞砸。

所以,你应该改变

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

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

请检查您的答案的格式。 –

+0

更好地使用'if(scanvalue!= 1) break;' – chux

+0

right,thank you –