为什么scanf函数不会等待用户输入失败一次之后?(why does scanf not wait

2019-06-26 18:33发布

我在我下面的代码面对的问题。 当我输入任意一个整数,即(0-9)那么它是OK。 但是,当我输入一些其他字符,如AB或任何其他字母scanf()失败。 然后,它不会等待任何进一步的输入。

我已经附加了这样的代码段。 我只使用C标准库非常需要的错误处理。

#include <stdio.h>

int main()
{
    int choice;
    while(1)
    {
        printf("Enter your choice: ");
        if(0 == scanf("%d", &choice))
          {
              printf("Some error occured\n");
              //break;/*I did not want to break this loop as I use this to show menu*/
          }

        switch(choice)
         {
                      case 0:printf("Case 0\n");break;
                      case 1:printf("Case 1\n");break;
                      case 2:printf("Case 2\n");break;
                      case 3:printf("Case 3\n");break;
                      case 4:printf("Case 4\n");break;
                      case 5:printf("Case 5\n");break;
                      case 6:printf("Case 6\n");break;
                      case 7:printf("Case 7\n");break;
                      case 8:printf("Case 8\n");break;
                      case 9:printf("Case 9\n");break;
                      default:printf("Default case\n");break;

         }
    }
}

询问清楚的是:为什么没有等到失败后?

Answer 1:

scanf ,如果给定了输入不匹配格式规范,则输入不被消耗,并保持在输入缓冲器。 换句话说,不匹配的字符从来不读。

所以,当你键入,例如一个字符 ,你的代码将无限循环的scanf仍然失败在相同的字符。

scanf返回一个错误,你需要摆脱违规字符(县)的。

你可以不知道有多少字符将被输入,但一个简单的方法来消耗任何违规的字符是尝试读取字符串时scanf函数失败:

char junkChars[256];

printf("Enter your choice: ");
if (scanf("%d", &choice) == 0)
{
    printf("Some error occured\n");
    scanf("%s", junkChars);
}

这将清除输入缓冲器,而是依赖于的上界。 如果用户键入超过 256个字符,则scanf会继续消耗他们的下一次迭代(S)。

显然,这是一个丑陋的解决方案,但scanf是不是真的因为这个原因有很大的投入机制。 最好使用fgets来获取输入线作为一个字符串,然后控制该字符串自己的解析。



Answer 2:

这是由设计。

不要用 ,用继续



文章来源: why does scanf not wait for user input after it fails one time?
标签: c scanf