在C中将字符串附加到另一个字符串

时间:2013-12-21 22:34:23

标签: c string-concatenation

这个实现对你有意义吗?我正在尝试编写一个连接两个字符串的函数,可以调用appendstr(&dest, "xyz"); 我不确定这是一个很好的做法,我正在做什么,重新分配newptr超过origptr的空间,然后释放它,使其等于newptr。< / p>

void *appendstr(char **origptr, const char *strdata)
{
    size_t len1 = strlen(*origptr);
    size_t len2 = strlen(strdata);
    char *newptr = realloc(*origptr, len1 + len2 + 1);
    if (newptr != NULL)
    {
        memcpy(newptr + len1, strdata, len2 + 1);
        free(*origptr);
        *origptr = newptr;
    }
    return newptr;
}

我所要做的就是在*origptr中不改变任何内容,直到我确定内存分配没有问题,然后再进行连接。 另外,另一个问题是我是否正在分配我需要的内存量。

1 个答案:

答案 0 :(得分:4)

这应该足够了。这只是没有free()

的代码
void *appendstr(char **origptr, const char *strdata)
{
    size_t len1 = strlen(*origptr);
    size_t len2 = strlen(strdata);
    char *newptr = realloc(*origptr, len1 + len2 + 1);
    if (newptr != NULL)
    {
        memcpy(newptr + len1, strdata, len2 + 1);
        *origptr = newptr;
    }
    return newptr;
}

如果无法连接字符串,则返回NULL,并且*origptr不会更改。否则,它返回(可能是新的)分配的指针,数据连接在一起。然后*origptr将具有与返回值相同的值。

memcpy()而非strcat()因为strcat()需要通过内部调用strlen()(或执行自己的strlen()版本)来知道字符串的结束位置。无论如何你调用strlen()是因为你需要字符串的长度来计算要分配的内存量,你可以使用memcpy()直接复制第一个字符串后面的第二个字符串,跳过一个隐含的第二个字符串如果使用strlen(),请致电strcat()