【问题标题】:Program not recognizing character inputs in if-else statements程序无法识别 if-else 语句中的字符输入
【发布时间】:2015-07-05 22:27:12
【问题描述】:

我调试了程序,发现虽然你输入了一个选项,比如Y/y/n/N或者H/h/l/L,但是if函数不能识别输入,就跳过了。感谢您的任何建议! RNG 工作正常,对我来说一切都很好。

#include <stdio.h>
#include <time.h>



 int main(){
char startAnswer[1];
char gameAnswer[1];
int i;
int r;
int t;
int compare;
srand(time(NULL));

printf("Do you want to play a game? Y/N. \n");
scanf(" %c", &startAnswer);
start:
if (startAnswer == 'y' || 'Y'){
    goto game;
}
else if (startAnswer == 'n' || 'N'){
    printf("Game will now exit.\n");
}
else {
    printf("You entered an invalid answer, try again.\n");
    goto start;
}
game:
printf("There will be ten numbers calculated.\n");
printf("Try to guess what the numbers are before\n");
printf("they are displayed. One at a time.\n\n");
for(i = 0; i < 12; i++){

    randGen:
    r = ( rand() % 9 ) + 1;
    t = ( rand() % 9 ) + 1;
    if(t == r){
        goto randGen;
    }

    printf("Is the next number higher or lower than %d\n\n" , r);
    scanf(" %c" , &gameAnswer);
 //ignore       (r > t) ? (compare = 0) : (compare = 1);
    if (r > t){
        compare = 1;
    }
    else{
        compare = 0;
    }



    if (gameAnswer == ('H' || 'h')){
        if (compare == 1){
            printf("You win this round!");
            goto randGen;
        }
    }
    else if (gameAnswer == ('L' || 'l')){
        if (compare == 0){
            printf("You win this round!");
            goto randGen;
        }
    }
    else if (gameAnswer != ('l' || 'L' || 'h' || 'H')){
        if (compare == 0){
            printf("Please Enter H/L for higher/lower answer.\n\n");
            goto randGen;
        }
    }
    else{
            printf("You lost this round.");
            goto randGen;
    }
    r = t;

}



}

【问题讨论】:

  • 没有您的代码,我们根本无法帮助您。
  • 这不是正确的提问方式。请给我们看一些代码示例或者你做了什么。
  • 请提供有此问题的演示代码。
  • 用户输入n/N时,您不会退出游戏。
  • 为什么人们总是假设计算机正在神奇地“跳过”他们的状况?

标签: c arrays if-statement char logical-operators


【解决方案1】:

在你的代码中

if (gameAnswer == ('H' || 'h'))

不做你认为它做的事。将其更改为

if ((gameAnswer[0] == 'H')  || (gameAnswer[0] == 'h'))   //gameAnswer is an array

同样,对于所有其他事件。

还有,

scanf(" %c", &startAnswer);

应该是

scanf(" %c", &startAnswer[0]);

同样

注意:

  1. 如果您不需要array,不要使用一个。坚持一个变量。

  2. main() 的推荐签名是int main(void)。

  3. 只是一个建议,请尽量避免使用goto 语句。这不被认为是一种好的做法。尝试编写和使用函数。

【讨论】:

  • @AlterMann 谢谢,只是忽略了。已更正。 :-)
  • @farukdgn 看,我可以在现在的状态下对你的答案进行投票,但我希望你改进你的答案。我不是你的敌人。 :-)
  • @farukdgn 如果你可以相信我,我没有。我在重新迭代问题时发现了它,就像最新的编辑一样。 :-)
  • 感谢大家的信息。如您所知,我仍在学习。我认为犯错对学习过程至关重要。我现在正在修改我的代码。另外,我使用 gotos 的唯一原因是让它工作。我知道它们不是做事的好方法。
  • 这一切都为我解决了。谢谢你解释。我完全忘记了我将变量更改为数组,我还记得如何链接条件。谢谢大家!
【解决方案2】:

您的代码有 2 个问题:

  1. if 条件,例如:if (gameAnswer == ('H' || 'h')),应该是:if (gameAnswer == 'H' || gameAnswer=='h')

  2. chars:char startAnswer[1]; char gameAnswer[1]; 要么这样做:char startAnswer; char gameAnswer;,要么:在代码中使用 gameAnswer[0] 而不是 gameAnswer。

最后,对于srand 和rand,您需要包含stdlib 库,只需添加这一行:#include&lt;stdlib.h&gt;。 http://www.cplusplus.com/reference/cstdlib/srand/

【讨论】:

    【解决方案3】:

    有很多问题:

    其中一个是:

    char startAnswer[1];
    char gameAnswer[1];
    

    应该是什么

    char startAnswer;
    char gameAnswer;
    

    你的编译器肯定在这里发出警告。

    【讨论】:

      【解决方案4】:
      if (startAnswer == 'y' || 'Y'){
      

      没有。这不是如何链接条件。 You are translating broken English into C++.

      【讨论】:

        【解决方案5】:

        在阅读该选项之前,您是否使用fflush(stdin)?这将清理您的缓冲区。

        【讨论】:

        • fflush(stdin) 是未定义的行为,清理缓冲区使用int c; while ((c = fgetc(stdin)) != '\n' &amp;&amp; c != EOF);
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        • 2020-09-06
        • 1970-01-01
        • 2017-09-05
        • 2020-02-15
        • 1970-01-01
        相关资源
        最近更新 更多