为了账号安全,请及时绑定邮箱和手机立即绑定

Scanf在C中每隔一个时间循环跳过一次。

Scanf在C中每隔一个时间循环跳过一次。

C
守着一只汪 2019-06-17 16:25:08
Scanf在C中每隔一个时间循环跳过一次。我正在尝试开发一个简单的基于文本的挂人游戏,主游戏循环从提示开始,在每个字母上输入一个猜测,然后继续检查字母是否在单词中,如果不是,就会停止使用。然而,当我运行这个游戏时,每次都会出现两次提示,程序不会等待用户的输入。它也会带走生命(一次生命如果它是正确的输入,两次生命如果不是),所以它所接受的不是以前的输入。这是我的游戏循环,简化了一点: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;         }     }}我想问题是,如果它还没有接收到什么东西的话,它就会被吸收,但是我不知道为什么。有人知道吗?我在MacOSX10.5上使用GCC 4.0.1。
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

纽琳。

第一次遍历循环时,snf()读取字符。然后它读换行符。然后它读取下一个字符;重复。

怎么修?

我很少使用scanf(),但是如果使用格式字符串"%.1s",它应该跳过空白(包括换行符),然后读取非空白字符。但是,它需要的是一个字符数组,而不是一个字符:

char ibuff[2];while ((scanf("%.1s", ibuff) == 1){
    ...}


查看完整回答
反对 回复 2019-06-17
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

将问题分解成更小的部分:

int main(void) {
    char val;
    while (1) {
        printf("enter val: ");
        scanf("%c", &val);
        printf("got: %d\n", val);
    }}

这里的输出是:

enter val: g
got: 103enter val: got: 10

为什么scanf再给你一个“10”?

由于我们打印了ASCII值的ASCII编号,ASCII中的‘10’是“Enter”所以scanf还必须抓取“Enter”键作为字符。

当然,看着你scanf字符串,您每次在循环中都请求一个字符。控制字符也被认为是字符,并将被拾取。例如,您可以在上面的循环中按下“ESC”然后“Enter”,然后获取:

enter val: ^[got: 27enter val: got: 10


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 570 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信