为什么我的程序每次运行时都返回没有小数的第一个输入值?

时间:2016-11-22 19:31:55

标签: c for-loop int scanf

#include <stdio.h>

int main (void) {

    int count, value;
    double avg, sum;
    count = 0;
    sum = 0;
    printf("please input how many integers you have \n");
    scanf("%d", &count);

    for (int i = 0; i < count; i++) {
        printf("please input your values \n");
        scanf("%d", &value);
        sum = sum + value;
    }
    avg = sum / count;
    printf("your average is " "%f", avg);
}

示例:计数输入为4。输入值为7.6, 1, 2, 3

我理解for for循环scanf首先看7.6,但忽略小数点,因为它不是有效的输入形式,并将其传递给每个后续scanf in尽管他们从未真正接受过输入。这导致唯一输入的值为7,但是程序应该继续将7除以4以检索&#34;预期&#34;平均,但事实并非如此。我最终得到了7.000000,我无法弄清楚为什么会这样。

忽略我提示用户输入整数值的事实,即使输入了浮点值,因为它是我的家庭作业的一部分。任何提示或参考我应该学习的东西都很棒

2 个答案:

答案 0 :(得分:2)

  

据我所知,for循环中scanf首先看7.6,但忽略小数点[..]

没有。由于您输入的输入(7.6)与格式说明符%d不匹配,因此匹配失败。因此,scanf()失败了。这就是为什么你应该总是检查所有标准函数的返回码。请参阅7.21.6.2 The fscanf function

如果您希望能够读取浮点值,那么您应该阅读(更改您的代码)以读取浮点数(或双精度数)。

例如,阅读double

double value;
if (scanf("%lfd", &value) != 1) {
   /* handle failure */
}

一般建议:如果可能的话,不要使用scanf()。请阅读Why does everyone say not to use scanf? What should I use instead?以获取进一步说明。

答案 1 :(得分:1)

您的推理似乎是正确的,除了假设scanf会在后续迭代中将value设置为零。相反,在读取第一次迭代的时间段并将7分配给value之后,在后续迭代scanf上将看到句点,得出结论输入与格式不匹配,而不是触摸{完全{1}},在每次迭代时保持为7。 (它应该在第一次迭代时返回1,在后续迭代时返回0,以指示匹配和分配的项目数)

因此,循环将在每次迭代时添加7,然后除以迭代次数,得到7的结果。