迭代后,字符数组返回每4个字符

时间:2016-02-23 19:20:51

标签: c tcp

我正在编写一个连接到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个字符分配了足够的内存? 如何从缓冲区打印数据并在变为乱码时停止?

2 个答案:

答案 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; 电话之后