【问题标题】:While loop printing error messaged based on number of characters inputted根据输入的字符数循环打印错误消息
【发布时间】:2015-08-06 01:24:41
【问题描述】:

我正在尝试获取用户输入(小时)并按如下方式对其进行验证:

  • 必须是 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: 

在最后一个“无效。再试一次:”之后,我可以根据我的代码再次输入一些内容。

我只是不知道发生了什么以及为什么它会多次打印出错误消息(输入的字符数 + 1)。我也认为范围检查根本不起作用。我已经尝试了很多变体(包括 do-while 循环)来尝试让它工作,但我碰壁了。

【问题讨论】:

    标签: c error-handling while-loop scanf


    【解决方案1】:

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

    您的 while 循环也永远不会完成。 isdigit 如果输入的字符是“0”、“1”、...“9”,则返回 true。请注意,这些是字符,而不是您所想的数字。如果您尝试对它们进行算术运算,它将在这些字符的 ASCII 值上进行。例如,'1' 的 ASCII 值为 49。因此,如果输入 '1',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);
    }
    

    【讨论】:

    • 非常感谢您的解释,真的帮助了我!
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多