【发布时间】:2020-12-11 11:03:40
【问题描述】:
我正在实现一个带有基本输入有效性检查机制的超级简单的菜单选择程序。合法输入是 {1,2,3},因此可能的问题是超出此范围的数字或非整数。我的代码如下所示。这适用于前一个问题(即当我输入“4”时)但对于后者(当我尝试输入一个字符时),它会一遍又一遍地打印无效消息而不是等待新的输入,就像它一样除了第一次之外,每次迭代都完全跳过 scanf 行。我在这里错过了什么?
do{
try = scanf("%d", &selection);
if(try!=1 || selection < 1 || selection > 3){
printf("\nInvalid input. Dear guest, please enter '1', '2', or '3'.\n\nInput:");
}
}while(try!=1 || selection < 1 || selection > 3);
【问题讨论】:
-
当 scanf 失败时(try != 1),您必须在重试之前读取待处理的输入。 scanf 尝试读取一个数字,第一个非数字字符失败,并将该字符放回输入流中, 下一次迭代将再次遇到该字符。支持检查 scanf 的返回值 :-)。
-
您确定可以使用
try作为变量名吗? (它是try ... catch表达式的一部分)我建议你给它另一个名字。 -
@Dominique C,而不是 C++。但无论如何这可能是个坏主意,因为以后可能想迁移到 C++。
-
@Peter-ReinstateMonica:我写评论时考虑到要迁移到 C++。
-
远离
scanf。它并不真正适合交互式输入。用户键入整行,因此您希望为此做好准备。调用fgets,然后解析该行(使用sscanf、strtol或其他任何东西)。您可能还想尝试使用 GNU readline 或类似的库来替换fgets。
标签: c loops while-loop scanf infinite-loop