当用户输入-0.1时,为什么这个循环不会立即中断

时间:2018-02-10 01:25:06

标签: c loops while-loop int scanf

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

所以练习如下:写一个要求正整数的程序,然后打印它的double,除非数字是负数。

所以这是代码:

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

足够简单。

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

如果我只输入0或甚至-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: 

它停在那里。

我无法绕过这个。对不起,如果这是微不足道的。

感谢您的时间。

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

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

1 个答案:

答案 0 :(得分:9)

使用格式%iscanf()读取整数。如果您键入-0.1,则整数为-0。这不小于0,因此循环继续。

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