do-while循环中的scanf()即使输入测试也会导致无限循环

时间:2016-01-25 22:49:14

标签: c scanf do-while

我有这个:

float a, b, c;
int isInt;
do {
    puts("Please enter three positive lengths:");
    isInt = scanf(" %f %f %f", &a, &b, &c);
} while(a <= 0 || b <= 0 || c <= 0 || isInt != 3);

假设我的输入为1 2 f,然后是a == 1b == 2c == 0。更重要的是isInt == 2,这让我想知道为什么它不会再次正常循环......?

1 个答案:

答案 0 :(得分:3)

scanf(...)返回3以外的数字时,代码中的问题就是你所做的事情(更具体地说,你不做什么)。

目前,您的代码继续要求输入和循环,而不从输入缓冲区中取任何内容。当然,这会使您的程序进入无限循环。

为了解决此问题,您的代码应该读取并忽略直到下一个'\n'字符的所有输入。这将确保每次循环迭代都取得一些进展。

do {
    puts("Please enter three positive lengths:");
    isInt = scanf(" %f %f %f", &a, &b, &c);
    if (isInt == EOF) break; // Make sure EOF is handled
    if (isInt != 3) {
        scanf("%*[^\n]");
        a = b = c = -1;
        continue;
    }
} while(a <= 0 || b <= 0 || c <= 0);

Demo.