我正在尝试在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;
}
答案 0 :(得分:3)
问题是,因为s3
是append
中的局部变量,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
分配内存。这是一种危险的做法,因为记忆必须分别是free
或delete
&#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在字符序列中。