使用while <0条件将字符串输入scanf会导致无限循环

Nic*_*san 5 c string while-loop

我有一个"分钟"变量,我希望用户输入一个正数.

int main(void)
{
    float minutes;
    minutes = -1;
    printf("Find out how many bottles worth of water your showers use!\n");
    printf("How many minutes do you spend in the shower? ");
    scanf("%f", &minutes);
    while(minutes < 0)
    {
        printf("Please enter a positive number: ");
        scanf("%f", &minutes);
    }
}
Run Code Online (Sandbox Code Playgroud)

它适用于数字.如果分钟> = 0,它接受它,如果分钟<0,它会一直询问.如果我输入一个字符串,它会无限循环

printf("Please enter a positive number: "); 
Run Code Online (Sandbox Code Playgroud)

从来没有给我机会输入新的价值.为什么这样,我该如何解决?谢谢!

dbu*_*ush 6

如果未输入数值,则输入缓冲区中的任何类型都将保留.您可以通过读取返回值来检查这一点,该值scanf告诉您读取的项目数.如果为0,则可以使用getchar读取字符直到下一个换行符刷新缓冲区.

int main(void)
{
    int rval, c;
    float minutes;
    minutes = -1;
    printf("Find out how many bottles worth of water your showers use!\n");
    printf("How many minutes do you spend in the shower? ");
    rval = scanf("%f", &minutes);
    if (rval == 0) {
        while (((c = getchar()) != '\n') && (c != EOF));
    }
    while(minutes < 0)
    {
        printf("Please enter a positive number: ");
        rval = scanf("%f", &minutes);
        if (rval == 0) {
            while (((c = getchar()) != '\n') && (c != EOF));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)