Сравните символ с символом[i], не работающим в игре «палач»

#c #char

Вопрос:

Я пытался сделать игру в палача, моя идея заключалась в том, что вы указываете количество букв и слово, а затем программа заполняет символ _ буквами, которые есть в слове. Затем он запрашивает у вас букву и сравнивает, соответствует ли буква какой-либо букве в данном слове. Затем он заменяет соответствующую _ букву буквой, но не заменяет ее…

Что я делаю не так?

 #include <iostream>
#include <conio.h>
#include <cstdlib>
using namespace std;
int main()
{
    int game = 0;
    int n = 0;
    char blank[n - 1];
    char palabra[n - 1];
    char letra;
    cout << "Input the number of letters of the wordn";
    cin >> n;
    cout << "Input the wordn";
    cin >> palabra;
    for (int i = 0; i < n; i  ) {
        blank[i] = '_';
    }
    while (game != 1) {
        for (int i = 0; i < n; i  ) {
            if (letra == palabra[i]) {
                blank[i] = letra;
            }
            else {
                if (blank[i] != '_') {
                    blank[i] = blank[i];
                }
                else {
                    blank[i] = '_';
                }
            }
        }
        system("cls");
        cout << "n";
        for (int i = 0; i < n; i  ) {
            cout << blank[i] << " ";
        }
        cout << "Input a letter" << endl;
        cin >> letra;
    }
    getch();
    return 0;
}
 

Комментарии:

1. Это объявление массива int n = 0; символ пустой[n -1]; не имеет смысла. Спросите себя, сколько элементов в массиве?

2. используется std::vector для массивов динамического размера.

3. @Pedro Juan Если ваш компилятор поддерживает массивы переменной длины, а тип size_t имеет тот же размер, что и тип unsigned long long, то это объявление имеет пустой символ[n — 1]; объявляет массив с элементами 18446744073709551615.:)

4. @Педро Хуан Также эта переменная char letra; не была инициализирована. Таким образом, цикл while вызовет неопределенное поведение на своей первой итерации.

5. @Педро Хуан Вам нужно использовать объекты класса std::string вместо массивов переменной длины.

Ответ №1:

 int n = 0;
char blank[n - 1];
 

В этом есть три вещи, которые не так:

  1. Значение n инициализируется равным 0, но тогда массив будет иметь 0 - 1 длину.
  2. Значение n на самом деле неизвестно до тех пор, пока оно не будет введено пользователем, но вы пошли дальше и объявили blank с n-1 помощью записей.
  3. Даже если n бы они были инициализированы чем-то разумным, объявление

char blank[n - 1];

не является законным синтаксисом C . Массивы в C должны иметь размер, обозначаемый константой времени компиляции, а не переменной времени выполнения.


Чтобы избавиться от этих проблем, используйте std::string вместо массивов символов.

Если бы вы это сделали, код выглядел бы примерно так:

 #include <string>
#include <iostream>

int main()
{
    int game = 0;
    int n = 0;
    std::string palabra;
    char letra;
    std::cout << "Input the number of letters of the wordn";
    std::cin >> n;
    std::cout << "Input the wordn";
    std::cin >> palabra;
    std::string blank(n, '_'); // create a string with n underscores 
    //...
}
 

Остальная часть кода должна остаться прежней. Правильна ли общая логика программы, это было бы другой проблемой, но, по крайней мере, у вас нет проблем с массивами символов.