我有一个连接两个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);
}
答案 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
库函数。