似乎无法返回一个字符串

时间:2013-02-11 20:55:47

标签: c

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

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

此外,如果我只是按两次键盘输入,则会打印"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;
}

3 个答案:

答案 0 :(得分:3)

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

您应该做的是将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);

另外请记住在0中添加s3作为ogzd建议的append的最后一个字符(null-terminate the string)。

备选方案:

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

  • malloc中执行new(C / C ++)或append(C ++)为s3分配内存。这是一种危险的做法,因为记忆必须分别是freedelete&#39; d。

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

char *s3 = malloc(s3len+1);

通常你会说:

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

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

答案 1 :(得分:1)

不要忘记\0末尾的s3字符!

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

s3[s3len] = 0; // \0 character

答案 2 :(得分:1)

而不是返回局部变量s3

返回分配的副本:

return strdup(s3);

确保在完成后释放内存。

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