Как мне сравнить два символа без учета регистра?

#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 and toupper — это не a char , а an int , который должен содержать 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). Однако этот вопрос не помечен для какой-либо конкретной платформы. Поэтому вы можете вместо этого ссылаться на документацию, не зависящую от платформы, как я сделал в своем комментарии. Не стесняйтесь копировать мою ссылку.