请问我的程序有问题。每当我尝试输入浮点数时,它就会进入无限循环。我知道输入存储为整数。如何防止用户进入浮点数(如何过滤输入)。
当输入是浮点数时,为什么程序会进入无限循环。
这是一个例子:
#include <stdio.h>
main()
{
int i = 0;
while(i<10){
system("cls>null");
printf("%d^2 = %d\n", i, i*i);
printf("Index: ");
scanf("%d", &i);
}
}
答案 0 :(得分:2)
最好使用fgets()
从stdin读取完整的一行,并strtol()
将其解析为数字,例如:
char buffer[256];
char *endp;
int i;
while (fgets(buffer, sizeof(buffer), stdin) != NULL) {
// buffer now contains one line (including the terminating newline)
i = (int)strtol(buffer, &endp, 10);
// endp points to the first character after the parsed number:
if (endp > buffer && (*endp == 0 || isspace(*endp))) {
printf("%d^2 = %d\n", i, i*i);
} else {
printf("invalid input\n");
}
}
答案 1 :(得分:2)
当您调用scanf
来读取数字,但输入包含与输入格式说明符不兼容的内容时,scanf
不会消耗此类错误输入,而是将其保留在缓冲区中。您的程序不会在输入不匹配时清除缓冲区,进入无限循环:scanf
尝试再次读取int
,看到它不存在,并退出而不修改i
。您的循环看到i
小于10,并再次调用scanf
。
要解决此问题,请检查scanf
是否返回了一个输入。在输入正确时使用输入,或者使用scanf
说明符再次调用%*[^\n]\n
,这意味着“读取字符串的末尾,并丢弃输入”:
if (scanf("%d", &i) != 1) {
scanf("%*[^\n]\n");
}
注意星号 - 这意味着需要丢弃消耗的输入,而不是写入变量。
答案 2 :(得分:0)
#include <math.h>
#include <stdio.h>
int main (void)
{
int i = 0;
float j = 0;
while(i<10)
{
system("cls");
printf("%d^2 = %d\n", i, i*i);
printf("Index: ");
if (scanf("%f", &j) <= 0 && j-fabs(j) != 0)
{
printf ("The input is not an interger");
}
}
}