虽然输入不是数字,但进入无限循环

时间:2015-02-18 07:37:07

标签: c

我只是一个初学者,我正在尝试创建一个程序,要求输入一个数字,如果输入了一个字母,它会说"这不是一个数字"并再次询问一个数字,直到输入一个数字。

然而,我的程序继续使用当前代码进入无限循环。任何帮助将不胜感激以解决这个问题。此外,我还希望该计划能够说出#34;请输入一些内容"如果没有输入,但不知道如何做到这一点。感谢。

#include <stdio.h>

int main()
{
    float i;
    printf("enter a number");
    while(scanf("%f", &i) != 1)
    {
        puts("That is not a number.");
        scanf("%f", &i);
    }
}

4 个答案:

答案 0 :(得分:1)

您需要在scanf失败后清除stdin中的错误输入:

#include <stdio.h>

int main()
{
    float i;
    char trash[1024];

    while (1) 
    {
        printf("Please enter a number: ");
        fflush(stdout);

        if (1 == scanf("%f", &i))
          break;

        /* scanf failed: clear the bad input from stdin */

        if (NULL == fgets(trash, sizeof(trash), stdin))  /* NOTE: assumes 1 entry per line and no line longer than 1023 characters */
          exit((fprintf(stderr, "Unexpected EOF or error!\n"), 1));

        puts("That is not a number.");
    }

    printf("You entered: %f!\n", i);

    return 0;
}

作为清除该行的fgets()的替代方法,您可以调用scanf(“%1023s”,trash),这只会吸入下一个以空格分隔的一系列字符。例如,这将允许您在一行上处理多个错误混合的条目。

答案 1 :(得分:0)

您的程序进入无限循环,因为在无效输入后,(scanf("%d", &i) != 1)条件为TRUE,输入缓冲区中剩余的无效输入不会被消耗,它会被消耗掉。仍然在缓冲区。因此,反复读取相同的无效输入。

要避免,一旦scanf()失败,您需要在调用下一个scanf()之前清除输入缓冲区中包含的所有

也许在while循环中,调用getchar()直到换行或EOF会有所帮助。此外,第二个scanf()可以删除,恕我直言。

答案 2 :(得分:0)

在非数字[更准确地输入与scanf()格式化输入不匹配]之后,您需要清除标准输入。如果不是相同的输入将被读取,直到stdin被清理或您终止程序。可在此question

上找到参考答案

Quoted

  

成功时,该函数返回成功填充的参数列表的项数。由于匹配失败,读取错误或文件结束的范围,此计数可以匹配预期的项目数或更少(甚至为零)。

无限循环的原因:由于你没有清除stdin,scanf()会读取相同的值,并且条件总是满填充,导致无限循环。

使用以下编辑过的代码:

#include <stdio.h>

int main()
{
    float i;
    char c;

    printf("enter a number");
    while(scanf("%f", &i) != 1)
    {
        puts("That is not a number.");
        scanf("%f", &i);
        while ((c = getchar()) != '\n' && c != EOF); // Flush stdin
    }
}

答案 3 :(得分:0)

您的代码正在输入一个数字。这就是为什么如果你甚至给输入一个字母,它将采用字母的ASCII值,这是一个有效的数字。还有更多请以角色作为输入。在这里,我修改了应该有效的代码

 #include <stdio.h>

int main()
{
char i;
printf("enter a number");
while(1)
{
    scanf("%c",&i);
    if (c >=48 && c <= 57) // here ascii value of numbers between 0-9 is 48-57 respectively
   { 
puts("That is a number.");
break;
}
else
{
puts("That is not a number.");
scanf("%c",&i);
}

}
}