C- number checking function gives infinite loop
我正在尝试编写一个将获取数字的小函数。
该功能应该是防白痴的,因此,如果出现警告,它将发出警告。 有人输入了一个字符。
我写了一个类似下面的函数,但是如果我输入一个非整数,程序会给我一个无限循环,不断重复printf"无效数字",这样我就永远没有机会进行正确的输入。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <stdio.h>
#include <stdlib.h>
int main (void)
{
for (int ret = 0; ret < 1;)
{
int num ;
printf("
Please input a number:");
ret = scanf ("%d", &num );
if (ret < 1)
printf ("
Not a valid number!");
else
printf("
You input %d", num );
}
return 0;
} |
如何解决?
-
(y = 0)-> (y == 0)简单错字
-
请整理代码缩进
-
启用编译器警告,您不应遭受这种愚蠢的错误。
-
"该功能应该是防白痴的" –因此,请停止使用scanf()。 您的代码中仅存在对scanf()的调用,这意味着您不知道它的缺点,因此您的代码不能防白痴。
-
while (A)中的A应该做什么?
-
实际上,y = 0的错字是一个错误,但不是问题。 如下所述,没有scanf阻塞的无限循环是由于不同的原因而发生的。
将此行if (y = 0)替换为此if (y == 0)。
-
此解决方案可修复错误,但不能解决问题。 问题在于,如果用户输入的是文本而不是数字,则第一个scanf-s之后的所有scanf-s将立即返回(不阻塞新输入)。 这就是为什么问题是关于无限多个打印输出,而不仅仅是错误的打印输出。
注意下面的行,其中有关于吃掉输入缓冲区的注释。 由于您的scanf在输入缓冲区中找不到所需的内容,因此错误的输入只会停留在该位置,并且永远失败,除非您执行某些操作以"吃掉"它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include <stdio.h>
#include <stdlib.h>
int main (void)
{
printf("Hello world!
");
while ('A')
{
int x , y ;
printf("
x:");
y = scanf ("%d", &x );
printf("
x = %d", x );
if (y < 1)
{ // eat the input buffer so we can try again
while ( getchar() != '
' );
printf ("
WRONG!");
}
}
return 0;
} |
-
您编辑问题以将while更改为for,但是答案使用的是while:请问两个帖子之间的含义是否一致?