根据输入的字符数循环打印错误消息
While loop printing error messaged based on number of characters inputted
我正在尝试获取用户输入(小时)并按如下方式对其进行验证:
- 必须是 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:
在最后一个 "Invalid. Try again:" 之后,我可以根据我的代码再次输入一些东西。
我只是不知道发生了什么,也不知道为什么它多次打印错误消息(输入的字符数 + 1)。我也不认为范围检查在起作用。我已经尝试了很多这种方法的变体(包括 do-while 循环)来尝试让它工作,但我碰壁了。
scanf
调用设置为一次只接受一个字符。因此,在您按下 Enter 后,一个字符被读取,其余字符仍在输入缓冲区中,等待下一个 scanf
调用拾取。这就是为什么循环的行为如此。
您的 while 循环也永远不会完成。 isdigit
returns 如果输入的字符是“0”、“1”、...“9”,则为真。请注意,这些是字符,而不是您所想的数字。如果您尝试对它们进行算术运算,它将对这些字符的 ASCII 值进行运算。例如,“1”的 ASCII 值为 49。因此,如果您输入“1”,while 表达式的第一部分将为假,但第二部分将为真,它会说它无效。
即使您更正了上述问题,您仍在寻找用户输入 1 到 12 之间的值,因此一次查看一个字符并不是正确的方法。您应该期望用户输入一个字符串。您可以使用 scanf
的 %d
修饰符来做到这一点,如下所示。
int hour;
printf("Enter the hour: ");
scanf("%d", &hour);
while ( hour < 1 || hour > 12) {
printf("Invalid. Try again: ");
scanf("%d", &hour);
}
我正在尝试获取用户输入(小时)并按如下方式对其进行验证:
- 必须是 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:
在最后一个 "Invalid. Try again:" 之后,我可以根据我的代码再次输入一些东西。
我只是不知道发生了什么,也不知道为什么它多次打印错误消息(输入的字符数 + 1)。我也不认为范围检查在起作用。我已经尝试了很多这种方法的变体(包括 do-while 循环)来尝试让它工作,但我碰壁了。
scanf
调用设置为一次只接受一个字符。因此,在您按下 Enter 后,一个字符被读取,其余字符仍在输入缓冲区中,等待下一个 scanf
调用拾取。这就是为什么循环的行为如此。
您的 while 循环也永远不会完成。 isdigit
returns 如果输入的字符是“0”、“1”、...“9”,则为真。请注意,这些是字符,而不是您所想的数字。如果您尝试对它们进行算术运算,它将对这些字符的 ASCII 值进行运算。例如,“1”的 ASCII 值为 49。因此,如果您输入“1”,while 表达式的第一部分将为假,但第二部分将为真,它会说它无效。
即使您更正了上述问题,您仍在寻找用户输入 1 到 12 之间的值,因此一次查看一个字符并不是正确的方法。您应该期望用户输入一个字符串。您可以使用 scanf
的 %d
修饰符来做到这一点,如下所示。
int hour;
printf("Enter the hour: ");
scanf("%d", &hour);
while ( hour < 1 || hour > 12) {
printf("Invalid. Try again: ");
scanf("%d", &hour);
}