将float指定给整数时的无限循环

时间:2013-12-15 11:28:24

标签: c

请问我的程序有问题。每当我尝试输入浮点数时,它就会进入无限循环。我知道输入存储为整数。如何防止用户进入浮点数(如何过滤输入)。

当输入是浮点数时,为什么程序会进入无限循环。

这是一个例子:

#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);
    }
}

3 个答案:

答案 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");
        }
    }
}