c - Scanf 在 C 中跳过每隔一个 while 循环

标签 c gcc scanf

我正在尝试开发一个简单的基于文本的刽子手游戏,主游戏循环从提示输入每个字母的猜测开始,然后继续检查该字母是否在单词中并夺取生命如果不是,请关闭。但是,当我运行游戏时,每次都会出现两次提示,并且程序不会等待用户的输入。它还会夺走一条生命(如果输入正确,则一条生命,如果不正确,则两条生命),因此无论它吸收什么,都与之前的输入不同。这是我的游戏循环,稍微简化了一点:

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;
        }

    }
}

我认为问题是 scanf 认为它已经接受了一些东西,但它没有,但我不知道为什么。有人有什么主意吗?我在 Mac OS X 10.5 上使用 gcc 4.0.1。

最佳答案

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

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

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

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

警告:如果用户按两个键,然后按 Enter,scanf() 将返回第一个击键,吃掉第二个击键,并为下一个击键留下换行符输入调用。像这样的怪癖是许多程序员回避 scanf() 及其 friend 的原因之一。

关于c - Scanf 在 C 中跳过每隔一个 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33975732/

相关文章:

c - 如何使用 C 套接字程序在报告中显示客户端的 IP 地址?

带数据结构指针参数的 C 函数

使用 MSVC 2013 的 C++11 类内初始化器

c - 为什么 scanf 会用 0 覆盖之前读取的 unsigned char 变量?

c - fscanf == 1 做什么

c++ - 如何实现内存堆

c - 这个奎因是如何工作的?

c++ - 在if语句中使用切换用例

c++ - 我可以在特定部分中放置完整的命名空间吗?

c++ - C - 使用 scanf() 时额外的换行输入