我在下面的代码中遇到问题。当我输入任何整数,即(0-9)
时,就可以了。但是,当我输入其他字符时,A
,B
或任何其他字母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;
}
}
}
更清楚的问题是:为什么它不会在失败后等待?
答案 0 :(得分: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);
}
这将清除输入缓冲区,但依赖于上限。如果用户键入 more 而不是256个字符,则scanf
将在下一次迭代时继续使用它们。
显然这是一个丑陋的解决方案,但scanf
因此不是一个很好的输入机制。最好使用fgets
将输入行作为字符串,然后自己控制对该字符串的解析。
答案 1 :(得分:0)
这是设计的。
请勿使用中断,请使用继续。