如何将已动态分配的字符串复制到已动态分配的另一个字符串?

时间:2019-04-25 18:48:07

标签: c strcpy

我在尝试实现自定义strcpy函数时遇到麻烦,该函数应该处理src字符串大于目标字符串的情况。在这里,我提供了一些代码,以便您可以看到整个功能。我的问题是,尽管我分配了足够的内存来容纳所有src,但每次增加* dest时,它都会进入一个空地址。这会导致(双指针)dest = * src中的分段错误。 dest以char **的形式存储,因为实际上,必须传递的参数是另一个字符串,该字符串的大小可能比src小,并且我希望尽可能安全地覆盖* dest。

int customStrCpy(char** dest, char* src){
    int strlen1 = strlen(*dest), strlen2 = strlen(src);
    if(strlen1 < strlen2){
        //Creates a dynamically allocated array that is big enough to    store the contents of line2.
        *dest = calloc(strlen2, sizeof(char));
        char* backup_str = *dest;

        int copy_arrs;
        for(copy_arrs = 0; copy_arrs < strlen2; copy_arrs++){
            **dest = *src;
            *dest++; src++;
        }
        *dest = backup_str;
    }
    else strcpy(*dest, src);
}

最后,(char **)dest应该指向正确的字符串。

3 个答案:

答案 0 :(得分:0)

您需要在字符串长度上添加1,以允许使用空终止符,并且如果要分配新字符串,则应释放dest的旧内容。完成此操作后,您可以执行与strcpy()相同的操作,无需重新分配。

也不需要int返回类型(除非您要向malloc()添加错误检查并返回状态结果)。此函数修改了一个参数,应为void

void customStrCpy(char** dest, char* src){
    int strlen1 = strlen(*dest), strlen2 = strlen(src);
    if(strlen1 < strlen2){
        free(*dest); // Free the old string
        //Creates a dynamically allocated array that is big enough to store the contents of line2.
        *dest = malloc(strlen2+1);
    }
    strcpy(*dest, src); // or memcpy(*dest, src, strlen2+1);
}

答案 1 :(得分:0)

通常,strcpy返回char *,以便在其他操作中“直接”使用。

char *mysStrCpy(char **dest, const char *src)
{
    size_t len = strlen(src);
    char *tmpptr;

    *dest = malloc(len + 1);
    // or *dest = realloc(*dest, len + 1);
    if(*dest)
    {
        tmpptr = *dest;
        while(*tmpptr++ = *src++);
    }
    return *dest;
}

答案 2 :(得分:-1)

 *dest++;

增加dest,而不是指针dest指向。您想要:

(*dest)++;

ps:有更好的方法来完成您追求的工作。...