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/41620817/

相关文章:

写入内存时 scanf C 中的 char[] 与 char*

c - 用and int读取字符时,为什么值为4096 + ascii

c - 交错开关上的模糊 C 构造

c - 整数从字符串[]接收到错误的值

c++ - lock_guard 是 RAII 实现还是用于实现 RAII?

c++ - 头文件如何提供函数定义

c - 初始化结构错误 : 'theGrid' being used without being initialized

c - 在 C 中使用 fscanf() 读取文件

c - 为什么 scanf 在这里跳过输入?

c - While循环只发生一次