Как я могу использовать оператор else if, чтобы сравнить буквы и сделать его нечувствительным к регистру?

Итак, у меня есть этот блок кода здесь:

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 она переходит к остальному, если ТОЛЬКО ЕСЛИ ОТВЕТ — LOWERCASE , Но если я набрал B заглавными буквами, он воспринимает это как неправильное и переходит к оператору else как следует. Можно ли как-нибудь это исправить, чтобы он обнаруживал заглавные и строчные буквы? Большое спасибо.

1

Решение

Проблема в том, что строчные буквы больше заглавных. Смотрите таблицу ASCII: http://www.asciitable.com/. Вы, вероятно, хотите:

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

Другие решения

Во-первых, логическое ИЛИ — это ||, а не |.

Во-вторых, взгляните на таблицу 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 стандартная кодировка, но это не самая плохая идея знать возможные подводные камни :).

2

Все строки в некотором порядке, например, «0» < «А» < «В» < «C» < «D» < «E» < «ИКС» … < «А» < «Б» < «С» < «Г» < «Е» < «х» и так далее.

Все строчные буквы приходят после буква «Е», поэтому ваш тест не проходит. Тестовое задание первый для приемлемых ответов это «A» и «a», как вы сделали, затем «B», «b», … «d», а все остальное недопустимо.

1

Если вы собираетесь принимать только 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;
0
По вопросам рекламы [email protected]