Почему массив char пуст после запроса другого ввода от пользователя? - PullRequest
0 голосов
/ 02 ноября 2018

Я разрабатываю TicTacToe на C, но у меня возникают проблемы с отображением имен игроков.
Каждый раз, когда игрок должен сделать ход, я показываю: «Твоя очередь,% s!».
Но со второй итерации имя игрока пустое.

После некоторых тестов я понял, что, когда я комментирую строку 56, проблема не возникает.

Выход на консоль:

Starting...

Type your username (20 characters): Paulo

Type your username (20 characters): Edson


   A   B   C 
0 ___|___|___
1 ___|___|___
2 ___|___|___


It's your turn, Paulo!

Choose a position (Ex.: B2, A0, etc): A2

Picked: A2


   A   B   C 
0 ___|___|___
1 ___|___|___
2 ___|___|___


It's your turn, !

Choose a position (Ex.: B2, A0, etc): A3

Picked: A3


   A   B   C 
0 ___|___|___
1 ___|___|___
2 ___|___|___


It's your turn, !

Choose a position (Ex.: B2, A0, etc): ^C

Это мой код:

#include <stdio.h>
#include <string.h>

void pickposition(char * position) {
  printf("\nChoose a position (Ex.: B2, A0, etc): ");
  scanf(" %2s", position);
}

void printtable(char table[3][3]) {
  printf("\n\n");

  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        char c = table[i][j];
        if (c != 'O' && c != 'X') {
            table[i][j] = '_';
        }
    }
  }

  printf("   A   B   C \n");
  printf("0 _%c_|_%c_|_%c_\n", table[0][0], table[0][1], table[0][2]);
  printf("1 _%c_|_%c_|_%c_\n", table[1][0], table[1][1], table[1][2]);
  printf("2 _%c_|_%c_|_%c_\n", table[2][0], table[2][1], table[2][2]);
  printf("\n\n");
}

void pickusername(char *name) {
  printf("\nType your username (20 characters): ");
  scanf("%20s", name);
}

int main() {
  printf("\nStarting...\n");
  char table[3][3];

  char player1[20];
  char player2[20];

  pickusername(player1);
  pickusername(player2);

  int next = 1;
  int counter = 0;
  while (1) {
    char nextname[20];
    printtable(table);
    if (next) {
        strcpy(nextname, player1);
    } else {
        strcpy(nextname, player2);
    }
    printf("It's your turn, %s!\n", nextname);

    char positionpicked[2];
    pickposition(positionpicked);
    printf("\nPicked: %s\n", positionpicked);

    counter--;
    if (counter == -20) {
        break;
    }
  }
}

PS .: Я знаю, что next всегда равен 1, это всего лишь черновик.

1 Ответ

0 голосов
/ 02 ноября 2018

Когда я запускал вашу программу, она работала нормально для меня. Но требуется небольшая коррекция в размере массива positionpicked. Вы просите пользователя ввести два символа (A0 / B1), но positionpicked имеет только 2 элемента, что означает, что для хранения '\0 'нет выделенной памяти. Поэтому размер positionpicked должен быть увеличен до 3.

Это также может быть причиной проблемы (я не уверен, но, скорее всего, так и будет), так как есть вероятность, что этот символ NULL перезапишет player1 [0].

Во время первой итерации: -

player1 -> Pablo0
player2 -> Edson0
positionpicked -> A20 /* Since positionpicked can only store 2 bytes the 0('\0')
                         is stored in the adjacent memory location */

Во время второй итерации: -

player1 -> 0ablo0    /* Which will print a null string */
...