C如何使用EOF突破循环?

时间:2016-01-20 22:51:49

标签: c

我的程序基本上要求用户输入一个未定义的浮点数,我希望程序输入用户输入EOF时的最小值,最大值和值的平均值。

现在,当用户输入数字<= -100,000或=&gt;时,循环退出并输出最小值,最大值和平均值。 100,000,这是程序对用户输入的限制。

#include <stdio.h>
int main()
{


    float sum, smallest, largest;
    float value, average,check;
    int count;

    sum = 0.000000;
    count = 0;
    check = scanf(" %f",&value);
    smallest = value;
    largest = value;

    while (value >= -100000 && value <= 100000)
    {
        sum += value;
        count++;
        if (value > largest)
            largest = value;

        else if (value < smallest)
            smallest = value;

        scanf(" %f",&value);
    }
        average = sum / count;
        printf("%.2f ",smallest);
        printf("%.2f ",largest);
        printf("%.2f\n",average);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您希望如何处理错误(非数字)输入?

最简单的方法可能如下:

while ( scanf( "%f", &value ) == 1 && value >= -100000 && value <= 100000 )
{
  // do stuff with value
}

这将循环直到value超出指定范围 scanf输入失败,原因是匹配失败(输入不是数字)或因为已发出EOF信号,或者由于某些其他输入错误。

请注意&&运营商强制进行从左到右的评估;在进行测试之前,scanf调用将被执行并value更新。

另请注意,如果用户输入的数字包含12.3r之类的非数字尾随字符,则scanf会转换并将12.3分配给value并离开{ {1}}卡在输入流中,这将导致下一次调用r失败,此时循环将退出。

答案 1 :(得分:1)

正如其他人所指出的那样,使用scanf结果。 而且您不需要从2个位置调用scanf。 我建议这样的事情:

#include <stdio.h>

int main()
{
    float sum, smallest, largest, value, average;
    int count;

    for (count = sum = 0; scanf("%f", &value) == 1; count++) {
        if (value <= -100000 || value >= 100000)
            break;

        sum += value;

        if (count == 0)
            smallest = largest = value;
        else if (value > largest)
            largest = value;
        else if (value < smallest)
            smallest = value;
    }

    if (count) {
        average = sum / count;
        printf("%.2f %.2f %.2f\n", smallest, largest, average);
    } else {
        printf("error, no data processed\n");
    }

    return 0;
}