你的
memcpy
没有零终止目标缓冲区。同时
strncat
需要有效字符串作为目标。如果没有适当的零终止
斯特恩卡特
调用开始在缓冲区下游某个不可预测的位置串联,最终在缓冲区的末端运行。
你很有可能通过做
memcpy(path, a, a_len + 1);
以确保终止零也被复制。
但你为什么要混合
mem...
功能和
str...
功能?正确地执行是可能的,但在使用任何命令之前,您必须不断注意诸如正确的零终止之类的事情
字符串。。。
作用
可以认为,当弦的长度已知时,
内存。。。
功能比
str..
功能。在这种情况下,只要坚持
内存。。。
功能。例如,在您的情况下,这应该正常工作
memcpy(path, a, a_len);
memcpy(path + a_len, separator, s_len);
memcpy(path + a_len + s_len, b, b_len + 1);
或者(也许更好),您可以使用
sprintf
(或
snprintf
)在一条线上完成
size_t n_written = sprintf(path, "%s%s%s", a, separator, b);
assert(n_written + 1 == total_len);