【问题标题】:while loop works twice on each iterationwhile 循环在每次迭代中工作两次
【发布时间】:2016-03-10 21:06:04
【问题描述】:

我需要以有效的方式找到一个由用户确定的介于 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”。 s

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

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

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

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

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

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

你确定的数字是187!

user3121023 已经解决了这个问题。我想既然是评论,我不能结束这个问题。

【问题讨论】:

  • 感谢您的回复,我实际上读到 enter 也被接受为 char 并且因为它不是“y”,它进入 while 循环,然后获得正确的值,因此程序可以工作.我添加了 gedit 的输出,那还能是什么呢?
  • 当我使用它时,它只是重复 scanf 直到我输入一个字符而不是输入,当我输入一个字符并输入时,它仍然可以工作两次。它看起来更像是 while 循环有问题,因为第一个 printf 和 scanf 工作正常。
  • 哦,我的错...对不起,我的头有点模糊了。它现在可以正常工作。感谢您的帮助!
  • 没问题。如果您觉得有用,请随时 accept an answer

标签: c loops while-loop


【解决方案1】:

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

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

scanf(" %c", &user);

【讨论】: