проблема с моей собственной реализацией 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.

Другие вопросы по тегам