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

标签 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,这让我想知道为什么它又不正常循环了……?

最佳答案

您的代码中的问题是当 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.

关于c - do-while 循环中的 scanf() 即使进行了输入测试也会导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35003965/

相关文章:

c - scanf 跳过函数

javascript - 使用 Javascript Do while 循环降低星号

c - do-while 循环执行 1 或 2 次循环太多

c - 读取位域元素时在 C 中给出不同的值

c - OS161 : TLB miss on Load

c - 对整数使用 scanf

c - sscanf 读取多个字符

C While 循环显示 Max 和 Min 并以 0 结尾,但我不想考虑 0

arrays - 将 3D 数组实现为指向可变长度数组的指针

c - 为什么此代码不适用于 ruby​​ 1.9 但适用于 ruby​​ 1.8?