#c
#c
Вопрос:
Я создаю простую игру «Камень, ножницы, бумага«, в которой я считываю два символа из стандартного ввода. Каждый из этих символов должен быть одним из следующих: 'r'
(камень), 'p'
(бумага) или 's'
(ножницы).
Чтобы определить победителя, я сравниваю символы следующим образом:
if ( player1 == 'r' amp;amp; player2 == 's' )
printf( "Player-1 wins! Rock breaks scissors!n" );
Это сравнение работает правильно, если оба символа введены в нижнем регистре. Однако, если какой-либо из символов указан в верхнем регистре ( 'R'
, 'P'
или 'S'
), сравнение не будет работать должным образом. Я хочу, чтобы сравнение могло правильно обрабатывать как строчные, так и прописные символы.
Моя идея состоит в том, чтобы сравнение выглядело примерно так:
if ( player1 == 'r','R' amp;amp; player2 == 's','S')
printf( "Player-1 wins! Rock breaks scissors!n" );
Как мне правильно выполнить это сравнение?
Комментарии:
1. Вы можете использовать функцию
toupper
илиtolower
перед выполнением сравнения. Напримерplayer1 = tolower( player1 );
2. Я переформулировал ваш вопрос, чтобы сделать его более понятным, надеясь, что он привлечет к вам больше голосов. Не стесняйтесь отменить мои изменения, если они вам не нравятся.
Ответ №1:
Существует пара функций из заголовка <ctype.h>, которые могут вам помочь.
Эти функции: tolower
и toupper
. Они принимают символ в качестве параметра и возвращают эти значения в нижнем / верхнем регистре соответственно (если символ не является буквой, он возвращает значение без изменений).
Что вы можете сделать, это преобразовать в верхний или нижний регистр и сравнить с одной буквой.
if (tolower(player1) == 'r' amp;amp; tolower(player2) == 's')
или
if (toupper(player1) == 'R' amp;amp; toupper(player2) == 'S')
Этот способ, о котором я говорил выше, требует меньше кода и его легче читать.
Однако, если вы не хотите использовать эти функции, следующий код — это исправление, которое вам нужно для желаемого результата:
if ((player1 == 'r' || player1 == 'R') amp;amp; (player2 == 's' || player2 == 'S'))
Комментарии:
1. Параметр
tolower
andtoupper
— это не achar
, а anint
, который должен содержатьunsigned char
значение (илиEOF
). Элементы базового набора символов выполнения неотрицательны, но все, что пользователь ввел, не обязательно является таким символом. Таким образом, вызовы должны бытьtolower((unsigned char) player1)
. В противном случае, если пользователь вводит символ с отрицательным значением, поведение не определяется стандартом C.2. @EricPostpischil: Вы хотите сказать, что функции ввода, такие как
fgetc
, могут возвращать отрицательные значения, кромеEOF
того?3. Спасибо, использовал менее удобную для чтения версию, но она сработала. Очень признателен!
4. @vmp не могли бы вы помочь мне с чем-то еще в той же лодке? Я не могу задать другой вопрос, потому что у меня тайм-аут на 2 дня, потому что я неправильно отформатировал свой первый вопрос.
5. конечно. что это?
Ответ №2:
Используйте эту функцию: tolower
, поэтому каждое сравнение, которое вы собираетесь проводить, с буквами, которые сравниваются после преобразования в нижний регистр.
if (tolower(player1) == 'r' amp;amp; tolower(players2) == 's')
Комментарии:
1. Размещенная вами ссылка относится к документации, относящейся к конкретной платформе (Linux). Однако этот вопрос не помечен для какой-либо конкретной платформы. Поэтому вы можете вместо этого ссылаться на документацию, не зависящую от платформы, как я сделал в своем комментарии. Не стесняйтесь копировать мою ссылку.