【发布时间】:2017-04-18 20:30:33
【问题描述】:
我一直在编写一个需要整数输入的程序,但每次意外输入非整数时,scanf 函数都会停止工作或陷入循环。
这是我尝试做的一个例子:
int n;
printf("please enter 0 or 1\n");
top:
scanf("%i",&n);
if(n == 0)
{
printf("you entered 0!\n");
}
if(n == 1)
{
printf("you entered 1!\n");
}
if(n != 0 && n != 1)
{
printf("please enter either 0 or 1.");
goto top;
}
第三个 if 是如果您没有输入正确的数字,则将您送回顶部,但这不适用于字母和其他字符。 如果给定非整数输入,如何将其发送回顶部?
【问题讨论】:
-
通过输入
fgets并应用sscanf并检查其返回值来躲避它(研究手册页:scanffamily 的函数返回值是什么?)。如果你没有得到你想要的,转储输入字符串并得到另一个。 -
"如果给定非整数输入,如何将其发送回顶部?" --> 读取非整数并先将其丢弃。
-
您应该检查
scanf()的返回值以识别何时发生错误,例如输入不是数字。当发生这种匹配失败时,您必须从标准输入中读取至少一个字符——scanf()目前正在阻塞——否则它将留在原处,在下次尝试时造成麻烦。 -
虽然它有它的用途,但
goto这里只是糟糕的编码风格。使用循环!