如何使用else if语句来比较字母并使其不区分大小写?

时间:2014-06-06 15:26:49

标签: c++ if-statement equals

所以我在这里有这段代码:

string answer1;

answerQues1:    
    cout << "So, A, B, C or D?";
    cin >> answer1;

     if (answer1 == "A" | answer1 == "a")
        {
            cout << "It's the right answer, you have " << char(156) << "100!" << endl;
            PlaySound(TEXT("C:/Users/user/Downloads/Millionaire/£100correct.wav"), NULL, SND_FILENAME | SND_ASYNC );
            Sleep(2000);
        }

    else if (answer1 >= "E" | answer1 >= "e") //FIX THIS, IT'S ONLY ACCEPTING CAPITALS NOT LOWERCASES.
        {
            cout << "Whoops, you've entered an incorrect option! Remember, only A, B, C or D are acceptable." << endl;
            answer1.erase();
            goto answerQues1;
        }    

     else
        {
            cout << "I'm very sorry, it's an early exit for you - it's the wrong answer! You leave with nothing!" << endl;
            PlaySound(TEXT("C:/Users/user/Downloads/Millionaire/£100and£64000lose.wav"), NULL, SND_FILENAME | SND_ASYNC);
            Sleep (4000);
            PlaySound(TEXT("C:/Users/user/Downloads/Millionaire/gameOver.wav"), NULL, SND_FILENAME | SND_ASYNC);
            cout << "Thanks for playing! Press any key to exit the game" << endl;
            system("pause");
            return 0;
        }

else if语句检查答案是否大于或等于字母E,因为只有A,B,C或D可以接受。然后它会显示一条告诉用户的消息,删除answer1的值,然后返回到输入部分,基本上是循环。但是,当我输入一个不正确的选项(例如E)并立即输入一个可接受的选项(如B)时,它不接受B作为错误的答案,而不是转到else语句,如果答案是小的话,它会转到其他地方。但是,如果我在大写字母中输入B,它会将其视为错误,并按原样转到else语句。无论如何我可以解决这个问题,以便检测大写和小写字母?非常感谢。

4 个答案:

答案 0 :(得分:4)

问题是小写字母大于大写字母。请参阅ASCII表:http://www.asciitable.com/。你可能想要:

else if ((answer1 >= "E" && answer1 <= "Z") || answer1 >= "e")

答案 1 :(得分:2)

首先,逻辑OR是||,而不是|。

其次,看看ASCII表,你会看到&#39;&#39;&#39; E&#39;所以对于答案=&#34; b&#34 ;你的支票答案&gt;&#34; E&#34;是真的。您最好检查允许范围内的值,并给出结束值。

另外:如果你只接受一个字符作为选择,那么回答一个字符而不是一个字符串。

所以更好的解决方案是

char answer;

if(answer == 'A'  ||  answer == 'a')
   ...
if(!(('A' <= answer  && answer <= 'D')  ||  ('a' <= answer  && answer <= 'd'))
   ...

在检查值之前,您还可以考虑在答案中使用toupper / tolower函数。

如果你想要它真的安全,那么请记住,ASCII不是唯一的编码,并不是每个字符编码都能确保&#39; A&#39; +1 ==&#39; B&#39;和&#39; B&#39; +1 ==&#39; C&#39;等等(例如,EBCDIC是另一个字符编码,其中&#39; A&#39; - &#39;我按顺序排列,然后有一个差距而不是来J&#39; - &#39; R&#39)。好的,我知道,ASCII是 标准编码,但知道可能的陷阱并不是最糟糕的想法:)。

答案 2 :(得分:1)

所有字符串都按某种顺序排列,例如“0”&lt; “A”&lt; “B”&lt; “C”&lt; “D”&lt; “E”&lt; “X”......&lt; “a”&lt; “b”&lt; “c”&lt; “d”&lt; “e”&lt; “x”等。

所有小写字母在字母“E”之后,这就是你的测试出错的原因。首先测试 以获得可接受的答案,即“A”和“a”,然后是“B”,“b”,......“d”,其他一切都是不可接受的。

答案 3 :(得分:0)

如果您只接受A,B,C或D,那么为什么不接受输入为char并将其转换为较低的字符。不可否认,您也可以使用string - 一次一个字符。

无论如何,这是char的样本:

char answer1;
std::cout << "So, A, B, C or D?";
std::cin >> answer1;
char lower = tolower(answer1);
std::cout <<" You entered: " << lower << std::endl;