如何修复此函数,以便它返回两个字符串的串联?

时间:2016-04-15 15:26:30

标签: c arrays variable-length-array

我正在尝试在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中都找不到一个答案对我有用的文档。

如何更改我的函数以便它返回两个字符串的串联?

2 个答案:

答案 0 :(得分:2)

要说两件事

  • 不依赖于VLA,因为它们是C11标准中的可选部分。
  • 不需要在堆内存中分配VLA,至少标准不强制要求。

简单解决方案: (我没有检查所涉及的连接逻辑)

使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;
}