【问题标题】:Why does this loop not break immediately when the user inputs -0.1为什么当用户输入-0.1时这个循环不会立即中断
【发布时间】:2018-07-20 20:14:25
【问题描述】:

当我偶然发现这段代码时,我正在复习我为算法课所做的一些练习,但它并没有像我想象的那样工作。

所以练习如下:编写一个程序,请求一个正整数,然后打印它的双精度数,除非这个数字是负数。

代码如下:

int main(void) {
    int n = 1;

    while (n >= 0) {
        printf("Veuillez introduire un nombre entier positif: ");

        if (!(scanf("%i", &n)) || n < 0) 
            break;

        printf("Le double de %i est de: %i\n", n, (2 * n));
    } 
}

足够简单。

问题是,如果我尝试输入一个字符、一个负数……如预期的那样,程序会立即停止,但如果我输入“-0.1”,它首先会打印 0 的双倍,即 0,然后再次运行循环到 if 语句。

如果我只输入 0 甚至 -0,它不会继续运行(因为 0 不是负数,所以应该这样做)。

这是输出:

Veuillez introduire un nombre entier positif: -0  
Le double de 0 est de: 0  
Veuillez introduire un nombre entier positif: 1  
Le double de 1 est de: 2  
Veuillez introduire un nombre entier positif: -0.1  
Le double de 0 est de: 0  
Veuillez introduire un nombre entier positif: 

它停在那里。

我只是无法理解这一点。对不起,如果这是微不足道的。

感谢您的宝贵时间。

注意:这是我的第一篇文章,我还没有在这里找到答案,所以如果你找到它或者如果你有反馈,请随时发布它,我们将不胜感激。

编辑:用文本交换输出屏幕截图

【问题讨论】:

  • -0 不小于 0。由于您向 scanf() 询问整数,它看到 0,然后是 '.',然后停止,因为整数没有 '.'在他们里面。
  • 您正在为 int 输入浮点数。
  • 他输入了一个 int 就好了。后面还碰巧输入了一些乱码“.1”。
  • 好吧,我想我说错了。我希望它以-0.1 停止。我不明白的是它再次遍历循环直到 if 语句。如果输入不正确,它不会这样做。所以,如果我明白你的意思是 scanf 在再次调用它之前没有返回 EOF?
  • @lemonChief 是的,没错。见Barmar's answer

标签: c loops while-loop int scanf


【解决方案1】:

对于%i 格式,scanf() 读取一个整数。如果键入-0.1,则整数为-0。这不小于0,所以循环继续。

下一次循环时,它会尝试从.1 中读取一个整数。由于这不是整数,因此扫描失败并且scanf() 返回0。这会导致!scanf("%i", &amp;n) 为真,所以break; 被执行并且循环停止。

【讨论】:

  • 谢谢你说得很清楚。如果我必须使用 scanf,有什么办法可以避免这种情况发生?
  • 也许你应该用fgets()读一整行,然后用sscanf()从中解析数字。
  • 你可以使用scanf("%i\n", &amp;n) 这要求整数后面跟一个换行符,所以如果他们输入的不是整数,它就会失败。
  • scanf("%i\n", &amp;n) 实际上在这里对我不起作用。它也是一样的。太糟糕了,那将是一个非常优雅的解决方案:/
  • 那你为什么不能把fgets()放在if前面呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多