Ошибка: ISO C++ запрещает сравнение между указателем и целым числом [-fpermissive] при сравнении ввода символов в цикле do-while.

Вопрос или проблема

Я пытаюсь создать простую игру “Камень, Ножницы, Бумага” на 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;
}

Комментарии к изменениям:

  1. Использование одинарных кавычек: Замените строки "r", "p" и "s" на символы 'r', 'p' и 's'. Это позволит корректно сравнивать тип char с символами.
  2. Логический оператор: Убедитесь, что вы используете два амперсанда && вместо одиночного &, когда сравниваете условия в цикле do-while. Это логический оператор "И" (logical AND), который используется для комбинирования нескольких условий.

Теперь ваша программа будет правильно запрашивать у пользователя ввод до тех пор, пока не будет введен корректный символ ('r', 'p' или 's').

Оцените материал
Добавить комментарий

Капча загружается...