0

我正在尝试在 C 中附加两个字符串。

所以这是我的代码,如果我返回 s3,则不会打印任何内容。然而,如果我返回 s1 或 s2,它们会正确返回。

此外,如果我只是在键盘上按两次 Enter,它会打印"L¬(."

在 C++ 中,我从来没有遇到过这类问题,哎呀。

有人可以检查他们是否发现问题吗?

#include <stdio.h>
#include <string.h>

/*
    Return the result of appending the characters in s2 to s1.
    Assumption: enough space has been allocated for s1 to store the extra
    characters.
*/
char* append (char s1[ ], char s2[ ]) {
    int s1len = strlen (s1);
    int s2len = strlen (s2);
    int s3len=strlen(s1)+strlen(s2);
   // printf("%d", s1len);
    char s3[s3len];
    int k;
    int j;
    for(j=0; j<s1len; j++) {
        s3[j]=s1[j];
    }

    for (k=0; k<s2len; k++) {
        s3[k+s1len] = s2[k];

    }

    return s3;
}

int main ( ) {
    char str1[10];
    char str2[10];
    while (1) {
        printf ("str1 = ");
        if (!gets (str1)) {
            return 0;
        };
        printf ("str2 = ");
        if (!gets (str2)) {
            return 0;
        };
        printf ("The result of appending str2 to str1 is %s.\n", 
            append (str1, str2));
    }
    return 0;
}
4

3 回答 3

3

一个问题是,因为s3in 是一个局部变量,所以无论您是否返回指向它的指针,都会分配append内存,然后在超出范围(函数结束时)释放内存。s3append

您应该做的是将s3作为char *char[]作为参数传递给函数。

像这样:(改变append应该很容易)

// yes the +1 to be able to null-terminate the string is needed,
//   or just make it much bigger
char s3[strlen(str1) + strlen(str2) + 1];
append(str1, str2, s3);
printf("The output is %s\n", s3);

还记得添加 a作为 ogzd 建议的in0的最后一个字符(空终止字符串)。s3append

备择方案:

  • (C++)返回std::string(有点慢,因为内存被复制了)

  • 执行malloc(C/C++) 或new(C++) inappends3. 这是一种危险的做法,因为内存必须分别为free'd 或delete'd。

使用malloc,从字面上看,您唯一需要更改的是s3函数中的定义,以:

char *s3 = malloc(s3len+1);

通常你会说:

type *s3 = malloc(sizeof(type)*len);

但是char是 1 个字节,所以sizeof(char) = 1.

于 2013-02-11T21:03:49.257 回答
1

不要忘记\0结尾的字符s3

char s3[s3len+1];
......

s3[s3len] = 0; // \0 character
于 2013-02-11T21:01:02.277 回答
1

而不是返回局部变量 s3

返回它的分配副本:

return strdup(s3);

只需确保释放完成后返回的内存即可。

还要确保你 0 终止你的字符串,这在 C 中是必不可少的,因为这是区分字符串和数组的唯一方法。接受字符串参数的函数假定结尾 0 在字符序列中。

于 2013-02-11T21:16:06.280 回答