Я программирую игру подключения четырех серверов и клиентов, и мне нужно передать массив игры клиенту через строку. Я пытаюсь собрать массив в строковой переменной playerBoard, используя strcat, но мне кажется, что когда он попадает к клиенту, он отображает мусор, а также сервер показывает мне Segmentation fault как ошибку

Сервер:

 else
    {
      bzero(playersBoard, 100);
      int k, j;
      for( k = 0; k < HEIGTH; k++ )
    {
      for( j=0; j < WIDTH; j++ )
        {
          strcat(playersBoard, (char *)gameArray[k][j]);
          strcat(playersBoard, " ");
        }
    }
    strcat(playersBoard, "Now is your turn");
    printf("Players board is : \n%s\n", playersBoard);

      if(write(tdL.cl, playersBoard, 100) <= 0)
    {
      printf("[thread %d]\n", tdL.idThread);
      perror("[thread] Error at write\n");
    }
      else 
       printf("[thread %d] Message was sent with success\n", tdL.idThread);
      goto playerOneRetry;
    }

Клиент:

if (write (sd, message, sizeof(message)) <= 0)
{
  perror ("[client]Eroare la write() spre server.\n");
  return errno;
}

char message2[100];
  fflush(stdout);

  if (read (sd, message2, 100 ) < 0)
    {
      perror ("[client]Eroare la read() de la server.\n");
      return errno;
    }
  //writing message
  printf ("[client]Message received is : %s\n", message2);
0
Justplayit94 26 Дек 2015 в 00:16

2 ответа

Лучший ответ

Выражение gameArray[k][j] - это одиночный символ, а не строка. Вы не можете использовать его как аргумент в strcat. Попытка привести символ к char * превратит закодированный символ в указатель, который не будет указывать на допустимую строку. Его использование как таковое приведет к неопределенному поведению .

Вы можете добавить один символ в строку, например,

playersBoard[strlen(playersBoard)] = gameArray[k][j];
playersBoard[strlen(playersBoard) + 1] = '\0';

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

Также будьте осторожны с преобразованием, в большинстве случаев это считается запахом кода . . Если вы обнаружите, что вам нужно что-то разыграть, возможно, вы тоже что-то делаете не так.

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

1
Some programmer dude 25 Дек 2015 в 21:50

(char *) gameArray [k] [j]

1e: (char *) gameArray [k] [j]: почему приведение? gameArray [k] [j] должен иметь размер 2 dim. массив типа (char *). Если вам нужно сделать приведение, вы, вероятно, определили его неправильно, что приведет к ошибке seg. вина.

2e: вы уверены, что не переполняете playerBoard? Это вызвало бы это.

3e: bzero (PlayersBoard, 100); : размер playerBoard наверное известен. Вы всегда должны стараться избегать статического значения 100 и заменять его на might: sizeof (playerBoard).

4e: вы можете предотвратить выход игроков за пределы доски. Используйте strncat и не пишите больше, чем можете. В области защитного программирования .. вы должны.

2
Hans Lepoeter 25 Дек 2015 в 21:35