为什么这个程序不会突破循环并要求输入?

时间:2016-06-17 21:01:13

标签: c

我有以下代码:

badinput:
scanf("%d", choice);
switch (choice){
case 1:
...
case 2:
...
case 3:
...
default: {print("try again");goto badinput;}
}

当我在输入文本时输入1 2或3时,例如" a"程序不会在下一个scanf停止。这是什么问题

2 个答案:

答案 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;
}