我试图检查输入中是否有字母,如果有,请重复scanf函数(特别是在情况1的switch语句之后(。
它能够检测单个字符,如果输入字符,变量保持为0。但是,如果输入了一个数字和一个字符,它会接受该数字并忽略该字符。这是主要问题。
如果用户输入字母要求用户重新输入数字,则想知道可能的过滤方法。
while (true) {
printf("Enter code 1 :");
number = 0;
scanf_s("%d", &number);
if (number == 0) {
// find the new line to recieve new input
while (fgetc(stdin) != 'n');
}
switch (number) {
case 1:
managers = 0;
printf("Managersn");
while (managers == 0) {
managers == 0;
scanf_s("%lf", &managers);
if (managers == 0) {
managers == 0;
(printf("You have not enterd a numbern")),(fgetc(stdin) == 'n',managers==0, scanf_s("%lf", &managers));
}
}
printf("Managers have this much %.2f.n", managers);
break;
default:
printf("Invalid entry please enter 1 or 2.");
break;
}
}
}```
是否可以使用scanf验证输入?
对于良好的输入和一些错误的输入,可以进行验证,但通常不可能使用scanf()
验证输入。
。。。或者,如果转换的结果不能在对象中表示,则行为是未定义的。C17dr§7.21.6.2 10
对于scanf_s("%d", &number);
,如果文本数字输入超过int
范围,则结果为未定义行为(UB(。scanf_s("%lf", ...);
的可能UB
最好的方法是使用fgets()
读取用户输入的行,然后使用strtol()
和朋友验证字符串。
一个好的输入设计详细说明了当输入良好时应该如何处理错误的输入。
注意,由于stdin
上的文件结束,如果fgetc()
返回EOF
,下面的OP代码将导致无限循环。
if (number == 0) {
// find the new line to receive new input
while (fgetc(stdin) != 'n');
}
因为scanf(3(不会读取它无法解码的内容,所以对于不确定的输入(不是机器产生的(,首先读取输入,然后用sscanf取-评估过程循环(tm(。
不要测试scanf的参数(或者任何函数(来确定它是否有效。查看返回代码。scanf返回它处理的参数的数量,这告诉你它取得了什么样的成功。
如果需要,可以添加一个%n
参数(将需要检查(,该参数告诉处理了多少个字符。例如,您的用户可以输入12 dozen eggs
,scanf会将12读取为managers
,然后返回1,表示成功。但是仍然会有其他未处理的输入,您可能想要处理这些输入。通过先读取整行,然后扫描它,输入流不会被阻止,应用程序可以确定如何处理任何无效输入。