如何修复此函数,使其 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;
}