C使用memcpy连接的字符串连接

yrm*_*rmt 3 c string memcpy

在一些网络代码中,我需要对缓冲区中的数据包结构进行编码,以便通过套接字发送(2),但将编码缓冲区存储到更大的缓冲区似乎存在问题.这是一个小代码示例,说明了我在做什么:

char    tbuf[] = "test";
char    *buf = malloc(300);
memset(buf, '\0', 300);

int     bytes_to_copy = 300;
int     bytes_copied = 0;

while (bytes_copied < bytes_to_copy) {
    memcpy(buf + bytes_copied, tbuf, sizeof(tbuf));
    bytes_copied += sizeof(tbuf);
}
/* free, return */
Run Code Online (Sandbox Code Playgroud)

这应该将"test"附加到buf中60次,但是buf最终只包含一个"test".我使用memcpy错了吗?

Bat*_*eba 5

您在测试结束时反复复制空终止符.sizeof tbuf是5.

因此,所有C标准库函数都将忽略所有其他连接符.

解决方案:复制一个较少的字节memcpy,并确保在最终字符串中添加一个空终止符.

  • `memcpy(buf + bytes_copied,tbuf,sizeof(tbuf)-1); bytes_copied + = sizeof(tbuf)-1;` (3认同)