2

我在下面的代码中遇到问题。当我输入任何整数时,即(0-9),就可以了。但是当我输入一些其他字符时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;

         }
    }
}

更清楚的问题是:为什么失败后不等待?

4

2 回答 2

4

使用scanf,如果给定的输入与格式规范不匹配,则输入不会被消耗并保留在输入缓冲区中。换句话说,不匹配的字符永远不会被读取。

因此,当您键入例如一个a字符时,您的代码将无限循环,因为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则将在下一次迭代中继续使用它们。

显然这是一个丑陋的解决方案,但scanf由于这个原因,它并不是一个很好的输入机制。最好使用fgets将输入行作为字符串获取,然后自己控制对该字符串的解析。

于 2012-08-04T02:25:28.320 回答
1

这是设计使然。

不要使用break,使用continue

于 2012-08-04T02:23:51.477 回答