while循环在每次迭代时工作两次

时间:2016-03-10 21:06:04

标签: c loops while-loop

我需要找到一个由用户在1到1000之间以有效的方式确定的数字。看起来它有效,但我有一个问题。每当while循环迭代时,它会自行迭代两次,我无法摆脱这种情况。所以我不能称之为“完全”工作。我的代码是:

#include <stdio.h>

int main()
{
    int num = 500, div = 250;
    char user;

    printf("Please determine a number between 1 and 1000 and then press enter. \n");

    scanf("%c", &user);

    while ((user != 'Y') && (user != 'y'))
    {
        printf("Is your number %d? Please enter 'Y' if it is, 'S' if it is smaller and 'L' if it is larger. \n", num);

        scanf("%c", &user);

        if ((user == 'S') || (user == 's')) {
            num -= div;
            if (div != 1)
                div /= 2;
        }

        if ((user == 'L') || (user == 'l')) {
            num += div;
            if (div != 1)
                div /= 2;
        }
    }

    printf("The number you determined is %d!", num);

    return 0;
}

我该如何解决这个问题?

编辑:我无法从CodeBlocks输出示例,所以现在从Ubuntu添加它。输出如下:

  

请确定一个号码,然后按Enter键。

     

你的号码是500吗?如果是,请输入“Y”,如果小则输入“S”   和'L'如果它更大。小号

     

你的号码是250吗?如果是,请输入“Y”,如果小则输入“S”   和'L'如果它更大。

     

你的号码是250吗?如果是,请输入“Y”,如果小则输入“S”   和'L'如果它更大。小号

     

你的号码是125吗?如果是,请输入“Y”,如果小则输入“S”   和'L'如果它更大。

     

你的号码是125吗?如果是,请输入“Y”,如果小则输入“S”   和'L'如果它更大。升

     

你的号码是187吗?如果是,请输入“Y”,如果小则输入“S”   如果它更大,则为'L'。

     

你的号码是187吗?如果是,请输入“Y”,如果小则输入“S”   和'L'如果它更大。 ÿ

     

您确定的数字是187!

user3121023已解决此问题。我认为既然这是一个评论,我无法解决这个问题。

1 个答案:

答案 0 :(得分:3)

%c的{​​{1}}格式说明符将读取任何字符,包括空格。所以下次循环时,它会读取换行符并继续运行。

您需要在格式说明符中放置一个前导空格以吸收输入缓冲区中的换行符。

scanf