使用memcpy在中间使用空终止符连接多个字符串的问题

问题描述

我正在尝试将memcpy用作strncat,因为我需要在字符串中保留空终止符 我在尝试理解这段代码中缺少的内容时遇到了麻烦,我不知道如何检查它,但是我认为最终的字符串不正确,这是代码:

char *reass_tcp = malloc(sizeof(char) * 22 + 1);
char *a = "hel\0lo";
char *b = "W\0orld";
char *c = "wha\0ts\0up\r"; //last chunk of payload so it has the carriage 
                          //return which i included here

int len = 0;
memcpy(reass_tcp,a,actualsize(a));
len += actualsize(a);
memcpy(reass_tcp+len,b,actualsize(b));
len += actualsize(b);
memcpy(reass_tcp+len,c,actualsize(c));


return reass_tcp;

原始代码稍微复杂一点,但是可以减少上述问题。 我可以访问函数actualsize(): 此函数返回字符串的实际大小,包括中间的空终止符,但不包括所有C字符串中包含的字符串(字符串末尾的一个)。但是,它确实包括所有tcp数据包末尾包含的回车符。 例如

a = "hel\0lo";
actualsize(a) --> returns 6
c = "wha\0ts\0up\r"
actualsize(c) --> returns 10

更新: 这是场景的样子:

  1. 我有3个TCP负载块,最后一个仅包含回车符
  2. 我向所有块手动添加了空终止符
  3. 我的目标是将它们组合在一起,包括单个字符串之间包含的空终止符,以形成原始有效载荷

解决方法

由于您为空终止符分配了空间,因此应在3个memcpy调用之后通过添加以下内容来显式设置它:

len += actualsize(c);
reass_tcp[len] = '\0';

如果有效负载中有嵌入的空字节,reass_tcp仍将是C字符串,但是如果3个块中没有一个嵌入了空字节,则需要终止符。

,

结果证明代码是正确的,我的错误是在将重组消息作为实际的网络数据包发送之前为重组消息分配了错误的空间

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...