gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:35:05 29 4
gpt4 key购买 nike

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

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com