Конкатенация строк C с использованием memcpy без добавления

#c #string #memcpy

#c #строка #memcpy

Вопрос:

В некотором сетевом коде мне нужно закодировать структуры пакетов в буфере для отправки (2) через сокет, но объединение memcpy закодированных буферов в буфер большего размера кажется проблематичным. Вот небольшой пример кода, иллюстрирующий, что я делаю:

 char    tbuf[] = "test";
char    *buf = malloc(300);
memset(buf, '', 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 */
  

Это должно добавить «test» 60 раз в buf, но buf в конечном итоге содержит только один «test». Я неправильно использую memcpy?

Ответ №1:

Вы повторно копируете нулевой ограничитель в конце теста. sizeof tbuf равно 5.

Таким образом, все функции стандартной библиотеки C будут игнорировать все другие конкатенанты.

Решение: скопируйте на один байт меньше в memcpy и обязательно добавьте нулевой ограничитель к конечной строке.

Комментарии:

1. memcpy(buf bytes_copied, tbuf, sizeof(tbuf) — 1);

2. Это должно сработать, поскольку оно не включает нулевой терминатор, но проблема все та же.

3. Не забудьте следующую строку, в которой вы увеличиваете bytes_copied .

4. memcpy(buf bytes_copied, tbuf, sizeof(tbuf)-1); bytes_copied = sizeof(tbuf)-1;