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

How can I use an else if statement to compare letters and make it case insensitive?

本文关键字:不区 大小写 else 何使用 if 语句 比较      更新时间:2023-10-16

这里有一段代码:

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语句,它去到else如果只有当答案是小写的。但是如果我用大写字母输入B,它会认为它是错误的,并按照它应该的那样转到else语句。无论如何,我可以解决这个问题,所以它会检测到大写和小写字母?多谢。

问题是小写字母大于大写字母。参见ASCII表:http://www.asciitable.com/。您可能需要:

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

首先,逻辑或是||,而不是|

其次,查看ASCII表,您将看到'e'>' e',因此对于answer="b",您检查的答案>" e "为真。您应该更好地检查值是否在允许的范围内,因此也要给出一个结束值。

另外:如果您只接受一个字符作为选择,那么将答案设置为字符而不是字符串。

所以更好的解决方案是

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

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

如果你想要它真的安全,那么请记住ASCII不是唯一的编码,并不是每个字符编码都保证'A'+1=='B'和'B'+1=='C'等等(例如EBCDIC是另一个字符编码,其中'A'-'I'是有序的,然后有一个间隙,然后是'J'-'R')。好吧,我知道,ASCII是标准编码,但了解可能的陷阱并不是最坏的主意:)。

所有字符串都有一定的顺序,比如"0" <"一个"& lt;"B"& lt;"C"& lt;"D"& lt;"E"& lt;"X"……& lt;"一个"& lt;"b"& lt;"c"& lt;"d"& lt;"e"& lt;"x"等等。

所有的小写字母都出现在字母"E"之后,这就是为什么你的测试出错了。首先测试可接受的答案,即"A"answers"A",然后是"B","B",……d,其他都是不可接受的。

如果您只接受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;