在C中连接字符串

时间:2013-04-05 00:19:10

标签: c string

我有一个连接两个c字符串的方法。该方法返回一个新方法。它工作正常。有没有办法让这个方法无效,只修改第一个?

编辑:我不能使用strcopy或string.h库中的任何其他函数。也可以考虑由呼叫者确保s1有足够的空间容纳s2。

char *str_glue(char *s1, char *s2) 
{
char *r; //return string
int len1, len2;
int i, j;

len1 = str_length(s1);
len2 = str_length(s2);

if ((r=(char*)malloc(len1 + len2 + 1))==NULL)
{
    return NULL;
}

for (i=0, j=0; i<len1; i++, j++) {
    r[j] = s1[i];
}
for (i=0; i<len2; i++, j++)
{
    r[j] = s2[i];
}

r[j] = '\0';

return r;

}


int main() {

char* x = "lightning";
char* y = "bug";
char *z = str_glue(x, y);
printf("%s\n", z);
}

3 个答案:

答案 0 :(得分:0)

不是真的。 *s1是一个已经有固定长度的char []。如果你写过这个长度,你就会踩踏不在*s1内的记忆。您必须创建一个长度为*s1 + *s2的新帐户,以避免出现此问题。

编辑:我想如果*s1大到可以保持自己和*s2,你可以写一个能做你想要的功能。但除此之外,没有。

答案 1 :(得分:0)

使用标准函数strcat()

  

strcat() strncat()函数将以null结尾的字符串 s2 的副本附加到null的末尾 - 终止字符串 s1 ,   然后添加一个终止'\ 0'。字符串 s1 必须有足够的空间来保存结果。

答案 2 :(得分:0)

如果您在堆上分配相同内容,则可以考虑使用realloc s1。通过修改代码,我可以实现您期望的相同功能。

void str_glue(char **s1, char *s2) 
{
    int len1, len2;
    int i;
    char *curstr = *s1;

    len1 = strlen(curstr);
    len2 = strlen(s2);

    curstr=(char*)realloc(curstr, (len1 + len2 + 1));

    for (i=0; i<len2; i++)
    {
        curstr[(len1+i)] = s2[i];
    }
    curstr[(len1+len2)] = '\0';
}

main作为

int main()
{
    char* x;
    char* y = "bug";
    x = (char *)malloc(32);
   strcpy(x, "lightning");

   str_glue(&x, y);
    printf("%s\n", x);
}

您需要在stdlib.h定义中包含realloc

P.S:我假设您不打算使用C等标准strcat库函数。