创建我自己的strdup函数

Sax*_*owl -9 c pointers

我不明白为什么在这里我的字符没有被复制,strlen是正确的但我输出了'\n'

char            *my_strdup(char *str)
{
  char          *new_str;
  char          *to_copy;
  int           i;

  to_copy = str;
  i = strlen(str + 1);
  new_str = malloc(sizeof(*new_str) * i + 1);
  while(i - 1 > 0)
    {
      *new_str = *to_copy;
      new_str++;
      to_copy++;
      i--;
    }
  return(new_str);
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试功能:

int             main()
{
  char          *str;

  str = my_strdup("helloo");
  printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 6

您将返回指向字符串末尾的指针,而不是字符串的开头.

你需要返回malloc给你的指针.这就是你new_str在初始任务中所放置的内容new_str.但是不是返回它,而是修改指针然后返回它.

您的代码还有很多其他问题.例如,此时:

i = strlen(str + 1);
Run Code Online (Sandbox Code Playgroud)

您计算从中开始的字符串的长度str[1].如果您的字符串长度为零,那将导致未定义的行为.

也许你打算写:

i = strlen(str) + 1;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的呼叫malloc将分配太多.

使用sizeof(*new_str)是没有意义的,因为这保证是相等的1.

无论如何,这里有一些可能的选择,而不是试图修复你的代码.

char *mystrdup(const char *str)
{
    char *result = malloc(strlen(str) + 1);
    char *psrc = str;
    char *pdst = result;
    while (*psrc != 0)
    {
        *pdst = *psrc;
        pdst++;
        psrc++;
    }
    *pdst = '\0';
    return result;
}
Run Code Online (Sandbox Code Playgroud)

你可以使循环的主体更简洁如下:

*pdst++ = *psrc++;
Run Code Online (Sandbox Code Playgroud)

您可以使用for循环执行此操作:

char *mystrdup(const char *str)
{
    size_t len = strlen(str);
    char *result = malloc(len + 1);
    for (size_t i = 0; i <= len; i++)
        result[i] = str[i];
    return result;
}
Run Code Online (Sandbox Code Playgroud)

或者你甚至可以memcpy像这样使用:

char *mystrdup(const char *str)
{
    size_t len = strlen(str);
    char *result = malloc(len + 1);
    memcpy(result, str, len + 1);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

请注意,在所有情况下,我返回的值malloc都是未修改的.

我忽略了对malloc调用的可能错误条件.你可以担心!