我正在尝试在C中编写一个自定义函数来连接两个字符串。到目前为止,我提出了:
char *strcat406(char *str1, char *str2) {
int str1length = 0;
int str2length = 0;
char newStr[str1length + str2length];
int i;
for (i = 0; i < str1[i] != '\0'; i++)
str1length += 1;
for (i = 0; i < str2[i] != '\0'; i++)
str2length += 1;
for (i = 0; i < str1[i] != '\0'; i++)
newStr[i] = str1[i];
for (i = i; i < str2[i] != '\0'; i++)
newStr[i] = str2[i];
return newStr;
}
我相信代码应该工作,除了读取return newStr;
的行,Xcode给我一个错误,读取“与返回的局部变量(x)相关的堆栈内存的地址”,我想这就是为什么我我没有得到像我想要的那样在main中打印字符串数组。
从我的研究中,似乎发生了这种情况,因为返回的数组的内存被释放了,所以我得到了一个我不想要的结果,尽管我在这个网站上甚至在C中都找不到一个答案对我有用的文档。
如何更改我的函数以便它返回两个字符串的串联?
答案 0 :(得分:2)
要说两件事
简单解决方案: (我没有检查所涉及的连接逻辑)
使newStr
成为指针并使用动态内存分配[malloc()
/ calloc()
]。
动态分配的内存保留在作用域中,直到以编程方式解除分配,因此它们不限于定义它们的函数作用域。在调用者函数中,您需要在完成后释放内存。
答案 1 :(得分:2)
您必须计算结果字符串的长度,然后为其分配内存,然后复制它,然后返回它。您现在正在使用VLA。最好使用malloc:
char *strcat406(char *str1, char *str2) {
int str1length = 0;
int str2length = 0;
char *newStr; // note: length not known yet
int i, j;
for (i = 0; i < str1[i] != '\0'; i++)
str1length += 1;
for (i = 0; i < str2[i] != '\0'; i++)
str2length += 1;
newstr= malloc (str1length + str2length + 1);
for (i = 0; str1[i] != '\0'; i++)
newStr[i] = str1[i];
for (j = 0 ;str2[j] != '\0'; j++)
newStr[i+j] = str2[j];
newstr[i+j]= '\0';
return newStr;
}
有更好的方法可以做到这一点,但我坚持你的方法。当你不再需要时,不要忘记为新字符串免费拨打电话。
编辑更好的方法是:
char *strcat406(char *str1, char *str2)
{
char *newStr= malloc(strlen(str1)+strlen(str2)+1);
strcpy(newStr,str1);
strcat(newStr,str2);
return newStr;
}