Search code examples
carraysscanftic-tac-toe

Why is the char array empty after requesting another input from user?


I'm developing a TicTacToe in C, but I'm having trouble displaying the name of the players.
Every time a player has to make a move, I display "It's your turn, %s!".
But from the second iteration, the player name is empty.

After some tests I figured that when I comment line 56 the problem doesn't happen.

Console output:

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

This is my code:

#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.: I know that the next is always 1, that is just a draft.


Solution

  • When I ran your program it was working fine for me. But there is a small correction required in the size of positionpicked array. You are asking the user to input two character(A0/B1) but positionpicked has only 2 elements which means that there is no allocated memory to store '\0'. So the size of the positionpicked should be increased to 3.

    This can also be the cause of the problem(i am not sure but most probably it will be) as there is chance this NULL character will overwrite the player1[0].

    During first iteration:-

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

    During second iteration:-

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