#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;