2016-03-10 86 views
1

我需要找到一个由用户以有效方式在1到1000之间确定的数字。它看起来像在工作,但我有一个问题。每当while循环迭代时,它会自我迭代两次,我无法逃避这种情况。所以我不能称之为“完全”工作。我的代码是: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中。输出如下:

请确定一个数字,然后按回车。

你的号码是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”。 y

您确定的数字是187!

user3121023已经解决了这个问题。我认为既然这是一个评论,我不能解决这个问题。

+0

感谢您的回复,我实际上读到enter也被接受为char,并且因为它不是“y”,它会在while循环中获取正确的值,以便程序正常工作。我添加了来自gedit的输出,那还有什么呢? – morpheus

+0

当我使用它时,它只是重复scanf,直到我输入一个字符而不是输入,并且当我输入一个字符并输入时,它仍然会工作两次。它看起来更像是while循环有问题,因为首先printf和scanf工作正确。 – morpheus

+0

哦,我的坏...抱歉,我的脑袋因为有点模糊。它现在可以正常工作。谢谢你的帮助! – morpheus

回答

3

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

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

scanf(" %c", &user); 
+1

不错的一个!我没有想到... –