获得我的程序的一些帮助:scanf中的无限循环

时间:2014-01-02 08:57:33

标签: c

我的程序得到5个等级并计算平均值和最大值。但是当我首先输入一个字母而不是一个等级时,它会连续打印“无效”。当我在输入一个int值后输入一个字母时,它会停止进一步获取剩余的值。有人解释我错在哪里?谢谢

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int grade[5];
    int temp;
    int temp2 = 0;
    for(int i = 0; i <= 4; i++) //getting inputs
    {
        printf("enter grade= ");
        scanf("%i", &temp);
        if(temp <= 100 && temp >= 0)
            grade[i] = temp;
        else
        {
            printf("invalid\n");
            i--;
        }
    }

    //print array
    for(int i = 0; i <= 4; i++)
        printf("%i\n", grade[i]);

    //Average
    for(int i = 0; i <= 4; i++)
    {
        temp2 = temp2 + grade[i];
    }

    printf("avg is= %i\n", temp2 / 5);

    //Max
    int mx = grade[0];

    for(int i = 1; i <= 4; i++)
        if(mx < grade[i])
        {
            mx = grade[i];
        }
    printf("max is= %i", mx);

    return 0;
}

2 个答案:

答案 0 :(得分:0)

您可以使用以下宏代替scanf() directelly

#define SCAN_ONEENTRY_WITHCHECK(FORM,X,COND) \
do {\
    char tmp;\
    while(((scanf(" "FORM"%c",X,&tmp)!=2 || !isspace(tmp)) && !scanf("%*[^\n]"))\
            || !(COND)) {\
        printf("Invalid input, please enter again: ");\
    }\
} while(0)

并在您的代码中以这种方式调用宏

for(int i = 0; i <= 4; i++) //getting inputs
{
    printf("enter grade= ");
    SCAN_ONEENTRY_WITHCHECK("%i",&tmp,(temp <= 100 && temp >= 0));
    grade[i] = temp;
}

有关宏的详细信息以及在代码中获得无限循环的原因,请参阅Common macro to read input data and check its validity

答案 1 :(得分:0)

来自scanf手册页:

These functions return the number of input items successfully
matched and assigned, which can be fewer than provided for, or
even zero in the event of an early matching failure.

因此,当扫描失败时,您必须阅读并抛出有问题的字符,否则它仍然会在缓冲区中。