我有以下代码:
badinput:
scanf("%d", choice);
switch (choice){
case 1:
...
case 2:
...
case 3:
...
default: {print("try again");goto badinput;}
}
当我在输入文本时输入1 2或3时,例如" a"程序不会在下一个scanf
停止。这是什么问题
答案 0 :(得分:1)
当您输入字符a
作为输入时,scanf
会失败,但它也会在输入流中留下a
。在尝试阅读更多数据之前,您必须清除流。
badinput:
scanf("%d", &choice); // That needs to be &choice, not choice
switch (choice){
case 1:
...
case 2:
...
case 3:
...
default: {clearStream(stdin); print("try again");goto badinput;}
}
其中clearStream
可以定义为:
void clearStream(FILE* in)
{
int c;
while ( (c = fgetc(in)) != EOF && c != '\n');
}
如果choice
是该行中唯一输入的内容,您可以使用fgets
读取整行,然后尝试从中提取choice
。
char line[20]; // Make it as large as you need
badinput:
fgets(line, sizeof(line), stdin);
if ( sscanf(line, "%d", &choice) == 1 )
{
switch (choice){
case 1:
...
case 2:
...
case 3:
...
default: {print("try again");goto badinput;}
}
}
else
{
print("try again");
goto badinput;
}
答案 1 :(得分:1)
程序不会突破循环并要求输入
原因:
问题在于,您输入scanf()
的字符仍保留在输入流中,因此您将省略将来的scanf()
函数调用。
您可以通过消费角色来避免这种情况。
解决方案:
这样做的一种方法是:
char
变量
char bad;
default
switch
的案例更改为:
default:
{
scanf("%c",&bad); //without bad use just scanf("%c"); but it gives warning
printf("try again");
goto badinput;
}