我正在编写连接四个服务器和客户端的游戏,我需要通过字符串将游戏数组传输到客户端。
我试图使用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;
}
答案 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。如果你发现你需要施展某些东西,那么你可能也做错了。
警告和投射的组合是最糟糕的,就像我上面所说的那样,你只是隐藏问题,但不能解决它。