我尝试接受用户输入(小时)并按如下方式验证:
我需要检查非数字输入并提醒用户。
我有以下代码:
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循环)来尝试让它发挥作用,但我已经碰壁了。
答案 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);
}