-9

我尝试构建自己的 strdup 函数,因为我知道该函数应该像 strcpy 一样工作,但是可以使用可以在另一个函数中使用的字符串,但是在我的原型中,我不明白为什么我的字符没有被复制。

我已经制作了这个原型,但我不明白为什么我的函数返回的指针不显示我的字符串

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

这是我的测试功能:

int             main()
{
  char          *str;

  str = my_strdup("helloo");
  printf("%s\n", str);
}
4

1 回答 1

6

您正在返回一个指向字符串末尾的指针,而不是字符串的开头。

您需要返回malloc给您的指针。这就是您在new_str最初分配给new_str. 但不是返回它,而是修改该指针然后返回它。

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

i = strlen(str + 1);

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

也许你的意思是写:

i = strlen(str) + 1;

在这种情况下,您的调用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;
}

您可以像这样使循环体更简洁:

*pdst++ = *psrc++;

你可以用 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;
}

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

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

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

我忽略了调用 malloc 时可能出现的错误情况。你可以担心这个!

于 2013-09-18T12:59:02.897 回答