使用 memcpy 在中间使用空终止符连接多个字符串
Issue concatenating multiple strings with null terminators in-between using memcpy
我正在尝试将 memcpy 用作 strncat,因为我需要保留字符串中的空终止符
我很难理解我在这段代码中遗漏了什么,我不知道如何检查它,但我认为最终字符串不正确,这是代码:
char *reass_tcp = malloc(sizeof(char) * 22 + 1);
char *a = "hel[=10=]lo";
char *b = "W[=10=]orld";
char *c = "wha[=10=]ts[=10=]up\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():
此函数 returns 字符串的实际大小,包括中间的空终止符,但不包括所有 C 字符串中的空终止符(字符串末尾的那个)。但是,它确实包括所有 tcp 数据包末尾的回车符 return。
例如
a = "hel[=11=]lo";
actualsize(a) --> returns 6
c = "wha[=11=]ts[=11=]up\r"
actualsize(c) --> returns 10
更新:
这是场景的样子:
- 我有 3 个 tcp 负载块,其中最后一个只包含回车 return
- 我手动为所有块添加了一个空终止符
- 我的目标是将它们组合起来,包括包含在单个字符串之间的空终止符,以形成原始有效载荷
由于您为空终止符分配了 space,因此您应该在 3 个 memcpy
调用之后明确设置它,方法是添加:
len += actualsize(c);
reass_tcp[len] = '[=10=]';
如果有效负载中嵌入了空字节,reass_tcp
仍然是 C 字符串,但如果 3 个块中的 none 嵌入了空字节,则需要终止符。
事实证明代码是正确的,我的错误是在将其作为实际网络数据包发送之前为重组消息分配了错误数量的 space
我正在尝试将 memcpy 用作 strncat,因为我需要保留字符串中的空终止符 我很难理解我在这段代码中遗漏了什么,我不知道如何检查它,但我认为最终字符串不正确,这是代码:
char *reass_tcp = malloc(sizeof(char) * 22 + 1);
char *a = "hel[=10=]lo";
char *b = "W[=10=]orld";
char *c = "wha[=10=]ts[=10=]up\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(): 此函数 returns 字符串的实际大小,包括中间的空终止符,但不包括所有 C 字符串中的空终止符(字符串末尾的那个)。但是,它确实包括所有 tcp 数据包末尾的回车符 return。 例如
a = "hel[=11=]lo";
actualsize(a) --> returns 6
c = "wha[=11=]ts[=11=]up\r"
actualsize(c) --> returns 10
更新: 这是场景的样子:
- 我有 3 个 tcp 负载块,其中最后一个只包含回车 return
- 我手动为所有块添加了一个空终止符
- 我的目标是将它们组合起来,包括包含在单个字符串之间的空终止符,以形成原始有效载荷
由于您为空终止符分配了 space,因此您应该在 3 个 memcpy
调用之后明确设置它,方法是添加:
len += actualsize(c);
reass_tcp[len] = '[=10=]';
如果有效负载中嵌入了空字节,reass_tcp
仍然是 C 字符串,但如果 3 个块中的 none 嵌入了空字节,则需要终止符。
事实证明代码是正确的,我的错误是在将其作为实际网络数据包发送之前为重组消息分配了错误数量的 space