关于我自己实现 strlcpy 的问题?

problem on My own implemntation of 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 != '[=10=]')
          *dst++ = *src++;
      i++;
  }
  *dst = '[=10=]';
  return i + 1;
}

我用原始的 strlcpy 做了一个测试,但我没有得到相同的结果 src = "字符串", len = 6 我的 strlcpy

的输出
return value = 6
dst = strin

原始strlcpy的输出

return value = 10
dst = strin

结果在 dst 中是相同的,但在 return 中值应该是试图生成的字符串的长度

来自documentation

The strlcpy() and strlcat() functions return the total length of the string they tried to create. For strlcpy() that means the length of src.

您 return 计算结果字符串的长度,而不是没有 len 限制的长度。

strlen(src) 保存在变量中,并 return 保存在最后。

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 != '[=10=]')
  {
      *dst++ = *src++;
      i++;
  }
  *dst = '[=10=]';
  return l;
}

此外,len参数和return类型应该是size_t

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


你似乎声称你做到了

ft_strlcpy(dst, "string", 6);  // 6

strlcpy(dst, "string", 6);  // 10

但输出表明你做了一些更接近

的事情
ft_strlcpy(dst, "abcdefghij", 6);  // 6

strlcpy(dst, "abcdefghij", 6);  // 10

strlcpy returns 它试图创建的字符串的长度,这意味着如果限制,将被复制的字符串的长度没有被强加。这不是什么 ft_strlcpy returns.


固定:

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