Вопрос или проблема
Я пытаюсь создать простую игру “Камень, Ножницы, Бумага” на C++. Когда я использую цикл do-while, чтобы убедиться, что пользователь вводит допустимый ввод (‘r’, ‘p’ или ‘s’), я сталкиваюсь со следующей ошибкой:
ошибка: ISO C++ запрещает сравнение между указателем и целым числом [-fpermissive]
} while((char) player != "r" && (char) player != "p" && (char) player != "s");
Вот код, который вызывает ошибку:
#include <iostream>
char getUserChoise();
int main() {
char player;
player = getUserChoise();
return 0;
}
char getUserChoise() {
char player;
std::cout << "Игра Камень, Ножницы, Бумага!\n";
std::cout << "r = камень \n";
std::cout << "p = бумага \n";
std::cout << "s = ножницы \n";
do {
std::cout << "Выберите вариант: ";
std::cin >> player;
} while(player != "r" && player != "p" && player != "s"); // Ошибка возникает здесь
return player;
}
Я подозреваю, что проблема в сравнении player (символ) со строковыми литералами “r”, “p” и “s”. Как я могу исправить эту ошибку сравнения?
Я пробовал привести player к char (что не помогло).
Я изучаю сравнение указателей и символов, но все равно не могу это решить.
Я ожидаю, что пользователь введет только ‘r’, ‘p’ или ‘s’, и если нет, цикл должен снова запрашивать ввод. Как правильно сравнить переменную char с односимвольными вводами?
Ответ или решение
Ошибка, с которой вы столкнулись, возникает из-за того, что вы пытаетесь сравнить переменную типа char
с строковыми литералами (типа const char*
) в C++. В C++ строковые литералы представляют собой указатели на первый символ строки, и именно поэтому происходит конфликт типов.
Для корректного сравнения символа с символами, вам необходимо использовать одинарные кавычки ('
) вместо двойных ("
). Одинарные кавычки используются для обозначения символьных литералов, тогда как двойные кавычки — для строковых литералов.
Вот как вы можете исправить ваш код:
#include <iostream>
char getUserChoice();
int main() {
char player;
player = getUserChoice();
return 0;
}
char getUserChoice() {
char player;
std::cout << "Игра Камень, Ножницы, Бумага!\n";
std::cout << "r = камень\n";
std::cout << "p = бумага\n";
std::cout << "s = ножницы\n";
do {
std::cout << "Выберите вариант: ";
std::cin >> player;
} while(player != 'r' && player != 'p' && player != 's'); // Исправлено: одинарные кавычки
return player;
}
Комментарии к изменениям:
- Использование одинарных кавычек: Замените строки
"r"
,"p"
и"s"
на символы'r'
,'p'
и's'
. Это позволит корректно сравнивать типchar
с символами. - Логический оператор: Убедитесь, что вы используете два амперсанда
&&
вместо одиночного&
, когда сравниваете условия в циклеdo-while
. Это логический оператор "И" (logical AND), который используется для комбинирования нескольких условий.
Теперь ваша программа будет правильно запрашивать у пользователя ввод до тех пор, пока не будет введен корректный символ ('r'
, 'p'
или 's'
).