而循环打印错误根据输入的字符数消息

时间:2015-08-06 01:24:42

标签: c error-handling while-loop scanf

我尝试接受用户输入(小时)并按如下方式验证:

  • 必须是1到12之间的数字

我需要检查非数字输入并提醒用户。

我有以下代码:

char hour;

scanf("%c", &hour);

while ( !(isdigit(hour)) || (hour < 1 && hour > 12)) {
    printf("Invalid. Try again: ");
    scanf("%c", &hour);
}

当这个循环运行,并且我输入了多个非数字字符时,我得到以下内容:

Enter the hour: rewe
Invalid. Try again: Invalid. Try again: Invalid. Try again: Invalid. Try again: Invalid. Try again: 

最后一次&#34;无效。再试一次:&#34;我可以根据我的代码再次输入内容。

我只是不知道发生了什么,以及为什么它打印错误信息这么多次(输入的字符数+ 1)。我也不认为范围检查是有效的。我已经尝试了很多这方面的变种(包括do-while循环)来尝试让它发挥作用,但我已经碰壁了。

1 个答案:

答案 0 :(得分:2)

scanf个调用设置为一次只接受一个字符。因此,在您按Enter键后,将读取一个字符,其余字符仍在输入缓冲区中,等待下一个scanf调用。这就是循环行为的原因。

你的while循环也永远不会完成。如果输入的字符是&#39; 0&#39;,&#39; 1&#39;,...&#39; 9&#39;,则isdigit会返回true。请注意,这些是字符,而不是数字,因为您正在考虑它们。如果您尝试对它们执行算术运算,它将在这些字符的ASCII值上。例如,&#39; 1&#39; ASCII值为49.因此,如果您输入&#39; 1&#39;,则while表达式的第一部分将为false,但第二部分将为true,并且它将表示它无效。

即使你纠正了上述问题,你也在寻找用户输入1到12之间的值,因此一次查看一个字符不是正确的方法。您应该期望用户输入字符串。您可以使用%d修饰符scanf执行此操作,如下所示。

int hour;
printf("Enter the hour: ");
scanf("%d", &hour);    
while ( hour < 1 || hour > 12) {
    printf("Invalid. Try again: ");
    scanf("%d", &hour);
}