对我的程序有点帮助:scanf中的无限循环

对我的程序有点帮助:scanf中的无限循环,c,C,我的程序得到5个等级,并计算平均值和最大值。但当我首先输入字母而不是等级时,它会连续打印“无效”。当我输入一个整数值后再输入一个字母时,它将停止进一步获取剩余值。有人能解释一下我的错误吗?多谢各位 #include <stdio.h> #include <stdlib.h> int main() { int grade[5]; int temp; int temp2 = 0; for(int i = 0; i <= 4; i++)

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

#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;
}
#包括
#包括
int main()
{
内部评级[5];
内部温度;
int temp2=0;

对于(int i=0;i您可以使用以下宏,而不是直接使用
scanf()

#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;
}

for(int i=0;i来自
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.

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

如果您的成绩是整数,为什么要输入字母作为输入?如果您希望获得更多帮助,您应该提供一个更有意义的完整标题。不是C开发人员,但在我看来,您必须在processi之前检查您的输入将字符解释为ASCII值。