如何使用else if语句来比较字母并使其不区分大小写?
How can I use an else if statement to compare letters and make it case insensitive?
这里有一段代码:
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;
- 使字母检查不区分大小写
- 如何执行不区分大小写的字符串比较?
- CMake 添加不区分大小写的源文件
- 提升program_option配置文件的不区分大小写的解析
- 如何提升Perl正则表达式匹配,支持区分大小写/不区分大小写
- 对字符串向量进行排序,但不区分大小写
- 比较最后一个字符,不区分大小写(带谓词?
- 在字符串的 boost::unordered_set 中使用 Lambda 函数 - 不区分大小写
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 如何使字符串中的每个字母不区分大小写
- 不区分大小写的字符串
- 使 strcmp() 不区分大小写而不使用 strcmpi() (C++)
- 是否有函数/WinAPI 可以判断一个字符串是否以不区分大小写的语言方式以另一个字符串开头?
- 极快的is_iequal?(不区分大小写的相等比较)
- C++,检查两个字符串的不区分大小写相等
- 在字符串向量中查找字符串,不区分大小写的c++
- 如何在C++中实现unicode不区分大小写的比较
- 不区分大小写的操作
- ICU:创建不区分大小写的排序规则
- 内置C++函数,使两个字符串的比较不区分大小写