Первый символ моего массива не распечатывается - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу запрограммировать игру Hangman, но прежде чем сравнивать строки и т. Д. Я просто хотел автоматически прокрутить массив, чтобы увидеть, работает ли он - ну, не так, как я себе представлял.

Все, кроме самого первого символа, распечатывается, но почему?

int gameWon = 0;
char secretWord[7][1] = {{"H"},{"A"},{"N"},{"G"},{"M"},{"A"},{"N"}};
char guessedChar;

while(gameWon != 1)
{
    printf("Guess a single letter: ");
    scanf("%s", &guessedChar);

    for(int i = 0; i < 7; i++)
    {
            printf("%c\n", secretWord[i][0]);
    }
}

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Тип, указанный в scanf, неверен, вы передаете адрес символу, но спецификатор формата %s ожидает строку, которая вызовет неопределенное поведение.Я предполагаю, что это влияет на остальную часть вашего кода.

Также тип secretword кажется немного странным, почему бы не просто массив или строка?

char secretWord[] = "HANGMAN";

scanfне лучший выбор для чтения с клавиатуры, вместо этого используйте fgets() и уберите окончание \ n или как в вашем случае, просто прочитайте первый символ.Тогда вам не нужно иметь дело с тем, что scanf оставляет символы в буфере клавиатуры.

while (... )
{
    printf("Guess a single letter: ");
    char buffer[128];
    if (fgets(buffer,sizeof(buffer),stdin) != NULL)
    {
      for (int i = 0; i < strlen(secretWord); ++i)
      {
        if (buffer[0] == secretWord[i])
        {
        ...
        }
      }
0 голосов
/ 23 февраля 2019

Вы используете неправильный спецификатор формата для scanf:

scanf("%s", &guessedChar);

Спецификатор формата %s ожидает char *, который указывает на первый элемент массива char и помещаетстрока с нулевым окончанием в этом месте.То, что вы передали, был адрес одного char.Это заставило scanf записать в область памяти guessedChar, вызвав неопределенное поведение .В этом случае это проявляется как перезапись близлежащей переменной, в частности, первого элемента массива secretWord.

. Измените его на использование %c вместо чтения отдельных символов.Кроме того, обязательно вставьте перед ним пробел в строке формата, чтобы поглотить все пробельные символы, оставшиеся во входном буфере:

scanf(" %c", &guessedChar);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...