为什么scanf在一次失败后不等待用户输入?

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

我已为此附加了代码段。 我非常需要仅使用C标准库进行error handling。

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

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

对于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将在下一次迭代时继续使用它们。

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

那是设计上的。

不要使用break继续使用。