-2

我有一个连接两个 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);
}
4

3 回答 3

0

使用标准功能strcat()

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

于 2013-04-05T00:31:16.283 回答
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

PS:我假设您不打算使用标准C库函数strcat或其他函数。

于 2013-04-05T00:35:51.667 回答
0

并不真地。*s1是一个已经有固定长度的 char[]。如果你写超过那个长度,你会踩到不在*s1. 你必须创建一个长度为*s1+的新文件,*s2以避免这个问题,就像你已经做过的那样。

编辑:我想你可以写一个函数来做你想做的事情,如果*s1它足够大来容纳自己并且*s2. 但除此之外,没有。

于 2013-04-05T00:26:23.747 回答