2012-08-10 55 views
0

我有一个非常简单的代码段,其中有一个做,而具有开关的情况下环路去如下:如果事故无限循环的错误输入

do { 
    printf("Enter Choice\n"); 
    scanf("%d", &choice); 
    switch(choice) { 
      case 1: printf("1 selected"); 
        break; 
      case 2: printf("exit"); 
        break; 
      default: printf("wrong input"); 
        break; 
    } 
} while (choice != 2); 

在这一段代码我输入一个字符而不是一个数字,该程序无限循环,并且甚至不接受输入。 我知道这是可以纠正,如果我进入开关罩前插入

if(isdigit(choice)) 

。但我的问题是为什么它首先发生。

它不应该转到默认情况并再次要求输入吗?

+1

我不明白'if(isdigit(choice))'是否可以解决这个问题,因为'choice'是已经解释过的整数输入,而不是'char'。 – 2012-08-10 10:24:11

+0

当你输入的内容与格式规范不同时,你会遇到问题,换句话说不是,为了得到这种情况,它必须是正确的格式。我会说接受一切作为一个字符串。这样就不会出现任何错误。然后,对输入字符串进行检查,根据需要进行转换......等等...... – ChiefTwoPencils 2012-08-10 10:28:18

回答

5

如果scanf无法将输入与格式说明符相匹配,则会将其保留在缓冲区中。所以下一次它仍然不会匹配等等。换句话说,它不会吃它无法比拟的。您必须检查scanf(匹配项目的数量)返回的值,以确保输入是预期的。

另外,跳过不必要的东西,你可以尝试(未经测试):

scanf("%*[^0-9]%d", &choice); 

这应该放弃任何东西,这不是试图读取一个十进制整数前一个数字。

1

请查看scanf说明书页面。

如果在这种情况下输入中的下一个东西不是数字,它不会消耗它。

您需要检查scanf的返回值,如果它为零,则消耗下一个字符并再次尝试(或者直到到达行尾)。