为什么即使输入了有效输入,我的程序仍会重复该行?

时间:2013-08-21 11:36:11

标签: objective-c dice

int main(int argc, const char * argv[])
{

@autoreleasepool {

    int userInput= 6 ;
    char userChar='\0';

    //creating new instances
    Dice *a = [[Dice alloc] init];
    //creating new objects
    Die *d1 = [[Die alloc] initWithSides:&userInput];
    Die *d2 = [[Die alloc] initWithSides:&userInput];
    //adding dices
    [a addDice:d1];
    [a addDice:d2];

    while(1)
    {
        printf("Press R to roll dices and Q to exit \n> ");
        scanf("%c",&userChar);

        if (userChar == 'r' | userChar =='R')
        {

            for (int i=0; i<10; i++)
            {
                [a rollDice];
                printf("Dice 1 =%d\n",d1.returns);
                printf("Dice 2 =%d\n",d2.returns);
                printf("The total values of both dice is %d\n",a.totalValue);
                printf("Does the dices have same value? Y(1) N(0) => %d\n\n",a.allSame);
            }
        }
        else if (userChar == 'q' | userChar == 'Q')
        {
            return 0;
        }

        else
        {
            printf("Enter a valid command!\n");
        }

    }

}
}

我尝试创建一个重复自身的循环,当按下r时,在用户想要退出程序时执行掷骰子和q。否则,继续重复,直到输入正确的输入。但我不明白为什么如果我输入一个输入,它会重复其他的阶段?像这样,

Press R to roll dices and Q to exit 
>l
Enter a valid command!
Press R to roll dices and Q to exit 
>Enter a valid command!  //Why does it repeats itself here??
Press R to roll dices and Q to exit 
>

2 个答案:

答案 0 :(得分:0)

嘿尝试使用以下必须工作的代码。

scanf(" %c",&userChar);

答案 1 :(得分:0)

如果您输入

 l<RETURN>
在控制台中

,输入缓冲区中有两个字符:“l”和 换行符。 第一个scanf()读取“l”,第二个scanf()读取换行符。

虽然这可以通过修改扫描格式来解决,但是更好的解决方案 用户输入的整行是使用fgets(),例如

char buf[100];
while (fgets(buf, sizeof(buf), stdin) != NULL) {
    userChar = buf[0];
    // ...
}

请注意,逻辑“或”运算符为||,而不是|