首先,不应该返回对临时对象的引用。
char con[lena+lenb];
注意,你得到的垃圾并不是来自于那里,因为你是在函数内部打印的。
其次,你没有分配足够的内存:应该是(在解决第一个问题后):
char *con = malloc(lena+lenb+1)
如果您仍然要使用strcpy/strcat,那么您的原始代码没有任何有用的功能(将char与char数组混合使用,而且此时数组的大小未知:这就是您遇到垃圾数据的原因)。
strcpy(con,a);
strcat(con,b);
有人认为它们是不安全的函数,因为我们知道输入的大小,所以可以这样写:
memcpy(con,a,lena);
memcpy(con+lena,b,lenb+1);
此外,
concat
的原型确实是错误的。它应该是:
char *concat(const char *a, const char *b){
由于它返回指向字符的指针而不是字符本身。并且参数应该是常量指针,这样你就可以使用你的函数来处理任何字符串。
完成后记得释放字符串。
修正代码(已测试,出人意料地返回“hello”,可能是因为它没有错误地编译通过了gcc -Wall -Wwrite-strings -Werror
。我的建议是打开警告并阅读它们。这样你将解决80%的问题):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *concat(const char *a, const char *b);
int main ()
{
char *con = concat("hel", "lo");
printf("%s\n",con);
return(0);
}
char *concat(const char *a, const char *b){
int lena = strlen(a);
int lenb = strlen(b);
char *con = malloc(lena+lenb+1);
memcpy(con,a,lena);
memcpy(con+lena,b,lenb+1);
return con;
}
strcpy()
或strcat()
或类似的机制来复制 C 中的字符串。) - Jonathan Lefflerstrcat
不能用于字符,只能用于字符串”,但是你的函数可以用于字符串,而不是字符。你需要重新表述这个陈述 - 或者重写代码(但这大多数情况下都是必要的)。 - Jonathan Leffler