C服务器和客户端 - Segmentaion故障并显示垃圾

时间:2015-12-25 21:16:25

标签: c server client

我正在编写连接四个服务器和客户端的游戏,我需要通过字符串将游戏数组传输到客户端。 我试图使用playerBoard在字符串变量strcat中收集数组,但似乎当它到达客户端时,它显示垃圾,而且,服务器正在显示我{{ 1}}作为错误

服务器:

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;
    }

2 个答案:

答案 0 :(得分:2)

(char *)gameArray [k] [j]

1e:(char *)gameArray [k] [j]:为什么演员? gameArray [k] [j]应该是2 dim。类型数组(char *)。如果你需要进行演员表演,你可能会把它定义为错误,这会导致seg。故障。

2e:你确定你不会超越球员吗?这会导致它。

3e:bzero(playersBoard,100); :球员的大小可能是众所周知的。你应该总是试着避免使用静态100并将其替换为:sizeof(playerBoard)。

4e:你可以防止球员掉队。使用strncat并且不要写更多的东西。在防守编程方面......你应该。

答案 1 :(得分:1)

表达式gameArray[k][j] 字符,它不是字符串。您不能在strcat中将其用作参数。尝试将字符强制转换为char *会将编码字符转换为指向不会指向有效字符串的指针。使用它将导致未定义的行为

您可以将单个字符附加到字符串,例如<。p>

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

你应该密切注意编译器会发出的警告,如果没有演员,它应该说些什么。警告往往是你做一些你不应该做的事情,并且禁用它们通常不是一个好主意,因为它只隐藏症状而不是问题。

在投射时也要小心,在大多数情况下,它被认为是code smell。如果你发现你需要施展某些东西,那么你可能也做错了。

警告和投射的组合是最糟糕的,就像我上面所说的那样,你只是隐藏问题,但不能解决它。