如何修复此函数,使其 returns 连接两个字符串?
How to fix this function so that it returns concatenation of two strings?
我正在尝试用 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] != '[=11=]'; i++)
str1length += 1;
for (i = 0; i < str2[i] != '[=11=]'; i++)
str2length += 1;
for (i = 0; i < str1[i] != '[=11=]'; i++)
newStr[i] = str1[i];
for (i = i; i < str2[i] != '[=11=]'; i++)
newStr[i] = str2[i];
return newStr;
}
我相信除了 return newStr;
行之外代码应该可以工作,Xcode 给我一个错误 "address of stack memory associated with local variable (x) returned" 我认为这就是我没有得到的原因像我想要的那样打印在 main 中的字符串数组。
根据我的研究,这似乎是因为返回数组的内存被释放了,所以我得到了一个我不想要的结果,尽管我没有在这个网站上找到一个答案,甚至在对我有用的 C 文档。
如何更改我的函数,使其 returns 连接两个字符串?
有两件事要说
- 不要依赖 VLA,因为它们已作为 C11 标准的可选部分。
- VLA 不需要在堆内存中分配,至少标准没有强制要求。
简单的解决方法: (涉及的拼接逻辑我没有检查)
使newStr
成为指针并使用动态内存分配[malloc()
/calloc()
]。
动态分配的内存保留在范围内,直到以编程方式解除分配,因此它们不受定义它们的函数范围的限制。在caller函数中,用完后需要释放内存
你必须计算结果字符串的长度,然后为它分配内存,然后复制它,然后return它。您现在正在使用 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] != '[=10=]'; i++)
str1length += 1;
for (i = 0; i < str2[i] != '[=10=]'; i++)
str2length += 1;
newstr= malloc (str1length + str2length + 1);
for (i = 0; str1[i] != '[=10=]'; i++)
newStr[i] = str1[i];
for (j = 0 ;str2[j] != '[=10=]'; j++)
newStr[i+j] = str2[j];
newstr[i+j]= '[=10=]';
return newStr;
}
有更好的方法可以做到这一点,但我坚持使用您的方法。不要忘记在不再需要新字符串时拨打免费电话。
编辑 更好的方法是:
char *strcat406(char *str1, char *str2)
{
char *newStr= malloc(strlen(str1)+strlen(str2)+1);
strcpy(newStr,str1);
strcat(newStr,str2);
return newStr;
}
我正在尝试用 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] != '[=11=]'; i++)
str1length += 1;
for (i = 0; i < str2[i] != '[=11=]'; i++)
str2length += 1;
for (i = 0; i < str1[i] != '[=11=]'; i++)
newStr[i] = str1[i];
for (i = i; i < str2[i] != '[=11=]'; i++)
newStr[i] = str2[i];
return newStr;
}
我相信除了 return newStr;
行之外代码应该可以工作,Xcode 给我一个错误 "address of stack memory associated with local variable (x) returned" 我认为这就是我没有得到的原因像我想要的那样打印在 main 中的字符串数组。
根据我的研究,这似乎是因为返回数组的内存被释放了,所以我得到了一个我不想要的结果,尽管我没有在这个网站上找到一个答案,甚至在对我有用的 C 文档。
如何更改我的函数,使其 returns 连接两个字符串?
有两件事要说
- 不要依赖 VLA,因为它们已作为 C11 标准的可选部分。
- VLA 不需要在堆内存中分配,至少标准没有强制要求。
简单的解决方法: (涉及的拼接逻辑我没有检查)
使newStr
成为指针并使用动态内存分配[malloc()
/calloc()
]。
动态分配的内存保留在范围内,直到以编程方式解除分配,因此它们不受定义它们的函数范围的限制。在caller函数中,用完后需要释放内存
你必须计算结果字符串的长度,然后为它分配内存,然后复制它,然后return它。您现在正在使用 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] != '[=10=]'; i++)
str1length += 1;
for (i = 0; i < str2[i] != '[=10=]'; i++)
str2length += 1;
newstr= malloc (str1length + str2length + 1);
for (i = 0; str1[i] != '[=10=]'; i++)
newStr[i] = str1[i];
for (j = 0 ;str2[j] != '[=10=]'; j++)
newStr[i+j] = str2[j];
newstr[i+j]= '[=10=]';
return newStr;
}
有更好的方法可以做到这一点,但我坚持使用您的方法。不要忘记在不再需要新字符串时拨打免费电话。
编辑 更好的方法是:
char *strcat406(char *str1, char *str2)
{
char *newStr= malloc(strlen(str1)+strlen(str2)+1);
strcpy(newStr,str1);
strcat(newStr,str2);
return newStr;
}