0

您好,我在测试实现时遇到了一个问题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 中是相同的,但返回值应该是试图制作的字符串的长度

4

2 回答 2

0

文档

strlcpy()andstrlcat()函数返回他们尝试创建的字符串的总长度。因为strlcpy()这意味着 的长度src

您正在返回结果字符串的长度,而不是没有len限制的长度。

保存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.

于 2021-11-04T19:26:37.143 回答
-1

它应该返回要复制的字符串的长度,而不是结果的长度。


你似乎声称你做到了

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;
}
于 2021-11-04T19:28:11.680 回答