我正在尝试开发一个简单的基于文本的子手游戏,并且主游戏循环从提示输入每个字母的猜测开始,然后继续检查该字母是否在单词中,并使其失去生命不是。但是,当我运行游戏时,每次都会出现两次提示,并且程序不会等待用户的输入。它也可以腾出一条生命(如果是正确的输入,则为一条生命,如果不是正确的输入,则为两条生命),因此它所吸收的一切与先前的输入不同。这是我的游戏循环,简化了一点:

while (!finished)
{
    printf("Guess the word '%s'\n",covered);

    scanf("%c", &currentGuess);

    i=0;
    while (i<=wordLength)
    {
        if (i == wordLength)
        {
            --numLives;
            printf("Number of lives: %i\n", numLives);
            break;
        } else if (currentGuess == secretWord[i]) {
            covered[i] = secretWord[i];
            secretWord[i] = '*';
            break;
        }
        ++i;
    }

    j=0;
    while (j<=wordLength)
    {
        if (j == (wordLength)) {
            finished = 1;
            printf("Congratulations! You guessed the word!\n");
            break;
        } else {
            if (covered[j] == '-') {
                break;
            }
        }
        ++j;

        if (numLives == 0) {
            finished = 1;
        }

    }
}


我认为问题出在斯堪夫,以为它没有被采用,但是我不知道为什么。有人有什么主意吗?我在Mac OS X 10.5上使用gcc 4.0.1。

最佳答案

当您使用scanf()读取键盘输入时,在按enter键后将读取输入,但是回车键不会占用Enter键生成的换行符。这意味着下次您从标准输入中读取内容时,将会有一个换行符在等待您(这将使下一个scanf()调用立即返回而没有数据)。

为避免这种情况,您可以将代码修改为:

scanf("%c%*c", &currentGuess);


scanf()匹配单个字符,但星号表示该字符将不会存储在任何地方。这具有消耗Enter键生成的换行符的效果,以便下次调用%*c时,将从空的输入缓冲区开始。

注意:如果用户按下两个键,然后按下Enter键,则scanf()将返回第一个击键,吃掉第二个击键,并将换行符留给下一个输入呼叫。这样的怪癖是许多程序员避免使用scanf()和朋友的原因之一。

07-24 09:46
查看更多