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/46860425/

相关文章:

c++ - fscanf 的愚蠢错误 - 逗号而不是点

C - 在 Windows 上编写在 UNIX 上编译,反之亦然

c - 如何将C游戏移植到浏览器

c - 在字段中显示比名称长三个字符的名称变量

android - Gcc 可以构建可执行程序吗?

c - 32b x86 程序集 scanf 用法

c - sendmsg() 函数内部做什么?

gcc - bin/arm-none-eabi-gcc 与 arm-none-eabi/bin/gcc

c - C中同一函数的多个隐式声明

c - 如何使用 scanf (不是 fgets)读取文本行?