memcpy используется для копирования фиксированных блоков памяти, поэтому, если вы хотите скопировать что-то более короткое, которое заканчивается на '\n'
, вы не хотите использовать memcpy.
Есть другие функции, такие как strncpy или strlcpy, которые делают подобные вещи.
Лучше всего проверить, что делают реализации. Я удалил оптимизированные версии из исходного исходного кода для удобства чтения.
Это пример реализации memcpy: https://git.musl -libc.org / cgit / musl / tree / src / string / memcpy.c
void *memcpy(void *restrict dest, const void *restrict src, size_t n)
{
unsigned char *d = dest;
const unsigned char *s = src;
for (; n; n--) *d++ = *s++;
return dest;
}
Понятно, что здесь оба куска памяти посещаются n раз. независимо от размера исходной или целевой строки, что приводит к копированию памяти за вашей строкой, если она была короче. Что плохо и может вызвать различное нежелательное поведение.
это strlcpy из: https://git.musl -libc.org / cgit / musl / tree / src / string / strlcpy.c
size_t strlcpy(char *d, const char *s, size_t n)
{
char *d0 = d;
size_t *wd;
if (!n--) goto finish;
for (; n && (*d=*s); n--, s++, d++);
*d = 0;
finish:
return d-d0 + strlen(s);
}
Хитрость в том, что n && (*d = 0)
оценивается как ложное и нарушает условие цикла и рано завершает работу.
Следовательно, это дает вам желаемое поведение.