我决定尝试创建一个连接函数,因为strcat不适用于字符,只能用于字符串。
#include <stdio.h>
#include <string.h>
char concat(char a[], char b[]);
int main ()
{
char *con = concat("hel", "lo");
return(0);
}
char concat(char a[], char b[]){
int lena = strlen(a);
int lenb = strlen(b);
char con[lena+lenb];
con[0] = a;
con[lena] = b;
printf("%s", con);
return con;
}
此代码打印“Ã...ÃÆ”。不知道我哪里出错了?
由于
答案 0 :(得分:3)
首先,您不应该返回对临时
的引用char con[lena+lenb];
(请注意,由于您在函数中打印),因此您获得的垃圾并非来自
其次,你没有分配足够的内存:应该是(第一个问题已修复):
char *con = malloc(lena+lenb+1);
然后使用strcpy / strcat,它更快,你的原始代码没有做任何有用的事情(混合字符数组的字符和数组的大小目前还不知道:那是< / em>你得到的垃圾的原因):
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){
(因为它返回chars上的指针而不是char。而且参数应该是常量指针,所以你可以将你的函数用于任何字符串)
并且你已经完成了(当你完成它时不要忘记释放字符串)
固定代码(经过测试,令人惊讶地返回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);
// copy & concat (including string termination)
memcpy(con,a,lena);
memcpy(con+lena,b,lenb+1);
return con;
}