Учитывая наличие символов NUL, они не являются строками (так как они заканчиваются NUL), поэтому строковые функции, такие как strlen
, не могут использоваться, поэтому размеры массивов необходимо будет передавать в объединяющая функция.
char *buf_concat(
char **buf_ptr, size_t *size_ptr,
const char *buf1, size_t n1,
const char *buf2, size_t n2,
const char *buf3, size_t n3,
const char *buf4, size_t n4
) {
*size_ptr = n1+n2+n3+n4;
char *buf_ptr; = malloc(*size_ptr);
if (!*buf_ptr)
return NULL;
char *p = *buf_ptr;
memcpy(p, buf1, n1); p += n1;
memcpy(p, buf2, n2); p += n2;
memcpy(p, buf3, n3); p += n3;
memcpy(p, buf4, n4);
return *buf_ptr;
}
char *buf;
size_t buf_size;
buf_concat(
&buf, &buf_size,
one, sizeof(one )-1,
two, sizeof(two )-1,
three, sizeof(three)-1,
four, sizeof(four )-1
);
(Мы должны вычесть 1, потому что sizeof("\xC1\x03\x1A\x0C")
- это 5
.)
Но есть пословица программиста, которая говорит, что если вы используете пронумерованные переменные, Вы должны использовать массив. Это не очень поможет, потому что вы пытаетесь абстрагироваться от того, что нельзя абстрагировать.
size_t buf_size =
sizeof(one )-1
+ sizeof(two )-1
+ sizeof(three)-1
+ sizeof(four )-1;
char *buf = malloc(buf_size);
char *p = buf;
memcpy(p, one, sizeof(one )-1); p += sizeof(one )-1;
memcpy(p, two, sizeof(two )-1); p += sizeof(two )-1;
memcpy(p, three, sizeof(three)-1); p += sizeof(three)-1;
memcpy(p, four, sizeof(four )-1);
Но поскольку "aaa" "bbb"
- это то же самое, что и "aaabbb"
, мы можем упростить !
size_t buf_size = sizeof(one two three four) - 1;
char *buf = malloc(buf_size);
memcpy(buf, one two three four, buf_size);
(Спасибо @ chqrl ie за напоминание, что я все время хотел упомянуть этот ярлык!)