проблема с моей собственной реализацией strlcpy?
Здравствуйте, я столкнулся с проблемой при тестировании реализации
strlcpy
long unsigned int ft_strlcpy(char *dst, const char *src, unsigned int len)
{
unsigned int l;
unsigned int i;
i = 0;
while (i < len - 1)
{
if (*src != '\0')
*dst++ = *src++;
i++;
}
*dst = '\0';
return i + 1;
}
Я провел тест с исходным strlcpy, но не получил того же результата src = "string", len = 6 вывода моего strlcpy
return value = 6
dst = strin
вывод исходного strlcpy
return value = 10
dst = strin
результат такой же в dst, но в возвращаемом значении должна быть длина строки, пытающейся сделать
2 ответа
Он должен возвращать длину копируемой строки, а не длину результата.
Вы, кажется, утверждаете, что сделали
ft_strlcpy(dst, "string", 6); // 6
а также
strlcpy(dst, "string", 6); // 10
Но вывод предполагает, что вы сделали что-то близкое к
ft_strlcpy(dst, "abcdefghij", 6); // 6
а также
strlcpy(dst, "abcdefghij", 6); // 10
strlcpy
возвращает длину строки, которую он пытался создать, то есть длину строки, которая была бы скопирована, если бы ограничение не было наложено. Это не то
ft_strlcpy
возвращается.
Фиксированный:
size_t ft_strlcpy(char *dst, const char *src, size_t len) {
if ( !len )
return strlen(dst);
size_t i = 0;
while ( --len ) {
if ( !( *dst++ = *src++ ) )
return i;
++i;
}
while (*str) {
++str;
++i;
}
return i;
}
Из документации
И
strlcat()
функции возвращают общую длину строки, которую они пытались создать. Дляstrlcpy()
это означает длинуsrc
.
Вы возвращаете длину результирующей строки, а не длину, которая была бы без ограничения.
Сохранить
strlen(src)
в переменной и верните ее в конце.
size_t ft_strlcpy(char *dst, const char *src, size_t len)
{
size_t l = strlen(src);
size_t i = 0;
while (i < len - 1 && *src != '\0')
{
*dst++ = *src++;
i++;
}
*dst = '\0';
return l;
}
Так же
len
параметр и тип возвращаемого значения должен быть
size_t
.