我正在编写一个连接到Echo Server的客户端,它返回发送给它的消息。 从TCP接收数据后,我在从char数组中获取数据时遇到问题。
这是char数组的定义方式。
#define RCVBUFSZ 50
char *rcvBuffer[RCVBUFSZ];
当我打电话
bytesRead = recv(sock, rcvBuffer, RCVBUFSZ - 1, 0)
我的rcvBuffer应该有49个字符,保存空终止符的最后一个位置但是...
如果我
printf("%s", rcvBuffer)
它打印出我想要在开头看到的消息然后是废话。
然后,如果我尝试使用for循环进行打印,我会得到消息的每个第4个字符。
for (i = 0; i < bytesRead; i++)
{
printf("%c", rcvBuffer[i]);
}
为什么我的char数组在指定50时为200个字符分配了足够的内存? 如何从缓冲区打印数据并在变为乱码时停止?
答案 0 :(得分:1)
char *rcvBuffer[RCVBUFSZ];
不是char
的数组,它是char*
的数组(指向char
的50个指针的数组)。将其更改为char rcvBuffer[RCVBUFSZ];
。除此之外,您应确保您的字符串由'\0'
终止:
char rcvBuffer[RCVBUFSZ];
int bytesRead = recv( sock, rcvBuffer, RCVBUFSZ - 1, 0 );
rcvBuffer[bytesRead] = '\0';
答案 1 :(得分:1)
声明
char *rcvBuffer[RCVBUFSZ];
为RCVBUFSZ
的{{1}}个指针分配空间。如果指针大小为4个字节,那么您将分配50 * 4 = 200字节的内存。
但根据您的描述,您希望为char
个字符数组分配内存。因此,您必须将代码更改为:
RCVBUFSZ
在将字符串传递给char rcvBuffer[RCVBUFSZ]; // no '*' after char
之前,您还必须NUL终止该字符串。因此添加
printf("%s", rcvBuffer)
在rcvBuffer[bytesRead] = 0;
电话之后。