嗨,请看一下此代码:
while (cont == 1) {
...
scanf_s("%d", &input);
if (0 < input <= 5){
switch (input) {
case 1:
printf("1");
break;
case 2:
printf("2");
break;
case 3:
printf("3");
break;
case 4:
printf("4");
break;
case 5:
cont = 0;
break;
default:
printf("Wrong input !");
break;
}
}else{
printf("Error, Not a number !");
}
}
如果我输入了不是数字的东西,它会导致无限循环。我如何限制字符输入?
您可以使用以下方式:
if(scanf_s("%d", &input) != 1) {
printf("Wrong input !");
break;
}
您应该始终检查scanf_s
的返回值。
scanf_s()
失败后,您需要读取至少一个字符(失败的字符(;通常,丢弃用户输入的其余行是最有意义的:
while (cont == 1) {
int rc;
...
if ((rc = scanf_s("%d", &input)) < 0)
{
printf("EOF detectedn");
break;
}
if (rc == 0)
{
int c;
while ((c = getchar()) != EOF && c != 'n')
;
printf("Error, Not a number!n");
continue;
}
if (0 < input <= 5){
switch (input) {
case 1:
case 2:
case 3:
case 4:
printf("%d", input);
break;
case 5:
cont = 0;
break;
default:
printf("Wrong input (1-5 required)!n");
break;
}
}
}
如果在" Gobble"循环中检测到EOF,则可以在其中检测到EOF并立即重复打印并打破循环。OTOH,下一个scanf_s()
也应报告EOF,因此不是100%。这有点取决于提示发生的位置;如果您获得EOF,则可能不应该再次提示,因此也许在内部循环之后进行测试:
if (c == EOF)
{
printf("EOF detectedn");
break;
}
else
{
printf("Error, not a numbern");
continue;
}
您可以使用读取到newline或Digit的" Gobble"循环的变体,并使用ungetch(c, stdin);
将数字返回输入流以进行下一个呼叫scanf_s()
进行处理 - 您可能不会提示如果要处理已经输入的数字(这会感到困惑(,请使用更多输入。
您可以玩的其他游戏。要考虑的一种选择是在放弃之前限制输入失败的数量 - 如果用户没有在10次尝试中输入有效的数字,则可能不会进行。
请注意,错误处理如何告诉用户有效的数字范围是什么?这有助于他们正确。另请注意,这些消息最终具有新线。这通常是一个好主意。在交互式I/O之外的上下文中,NewLine可以帮助确保输出在打印时出现,而不是在某些其他打印添加newline或输出缓冲区填充且待处理的数据毕竟刷新的任意时间。