Проблемы с «неверным преобразованием из« const char * »в« char »[-fpermissive]» [duplicate]

0

Я только начал изучать c++, и у меня возникла проблема с "неверным преобразованием из" const char * "в" char "[-fpermissive]" в моем исходном коде.

    const string alphabet = "abcdefghijklmnopqrstuvwxyz";
    string gameAlphabet = alphabet;

    char letterguess;
    int limbnumber = 0;

    do
    {
        cout << "Please choose a letter: ";
        cin >> letterguess;
        cout << letterguess;

        if (theWord.find(letterguess) == string::npos)
        {
            int temp2 = theWord.find(letterguess);
            theWord[temp2] = letterguess;
            int temp3 = gameAlphabet.find(letterguess);
            if (gameAlphabet[temp3] = " ")
            {
                cout << "You have already guessed this letter, please try again.";
            }
            gameAlphabet[temp3] = " ";
            cout << gameAlphabet;
        }
        else
        {
            limbnumber++;
            int temp1 = gameAlphabet.find(letterguess);
            gameAlphabet[temp1] = " ";

            if (limbnumber == 7 )
            {
                cout << "\n\nSorry " << playername << ", you lose.";
                cout << "Please try again.";
            }

        }

"Неверное преобразование из" const char * "в" char "[-fpermissive]" встречается в строках 19, 23 и 30. Если вы, ребята, видите ошибки, которые я сделал, сообщите мне. Благодарю!

  • 0
    gameAlphabet[temp3] нужен персонаж. Вы не можете поместить несколько символов в один.
  • 0
    if (gameAlphabet[temp3] = " ") вероятно, не делает то, что вы хотите.
Теги:

2 ответа

2

Ошибка возникает в таких выражениях, как это

gameAlphabet[temp3] = " ";

" " является строковым литералом, который в выражениях преобразуется в указатель на первый символ литерала. Вместо строкового литерала вы должны использовать объект типа char. Например

gameAlphabet[temp3] = ' ';

Вместо двойных кавычек вам нужно использовать одинарные кавычки. Хотя вы можете написать, используя строковый литерал, следующим образом

gameAlphabet[temp3] = " "[0];

Но этот код только путает пользователей.

Также учтите, что ваша программа недействительна. Например, рассмотрим этот фрагмент кода

    if (theWord.find(letterguess) == string::npos)
    {
        int temp2 = theWord.find(letterguess);
        theWord[temp2] = letterguess;

Условие theWord.find(letterguess) == string::npos meabs, что символ не найден, Итак, следующее утверждение

        int temp2 = theWord.find(letterguess);

возвращает string::npos Вы не можете использовать это значение как индекс в строке

        theWord[temp2] = letterguess;

Также после этого утверждения

        int temp3 = gameAlphabet.find(letterguess);

вы должны проверить, равно ли temp3 string: npos. В противном случае код имеет неопределенное поведение.

1
if (gameAlphabet[temp3] = " ")
...
gameAlphabet[temp3] = " ";
...
gameAlphabet[temp1] = " ";

В каждом из этих случаев вы назначаете указатель (потому что " " на самом деле является символом const char*) для символа в вашей строке gameAlphabet.

Чтобы исправить это, измените значение " " на ' ' которое является одиночным символом пробела.

Кроме того, я предполагаю, что утверждение if вероятно, должно было быть сопоставлением, а это означает, что он должен использовать оператор сравнения ==.

  • 0
    "" - это const char[1] .
  • 0
    Очевидно, вы правы. Я просто пытался сделать точку зрения, скрывая ту же терминологию, что и ошибка компилятора.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню