C 无法连接两个字符串并从函数返回它

C 无法连接两个字符串并从函数返回它,c,segmentation-fault,runtime-error,C,Segmentation Fault,Runtime Error,下面的C代码给出了分段错误 #include <stdio.h> #include<string.h> char *getSegment(char *symbol2,char *symbol3,char *filename) { if (strcmp(symbol2,"static") == 0) return strcat(filename,symbol3); } int main() { char *symbol2="s

下面的C代码给出了分段错误

#include <stdio.h>
#include<string.h>
char *getSegment(char *symbol2,char *symbol3,char *filename) {
    if (strcmp(symbol2,"static") == 0) return strcat(filename,symbol3);
}

int main() {
    char *symbol2="static";
    char *symbol3="asdf";
    char *filename="zxcn";
    printf("%s\n",getSegment(symbol2,symbol3,filename));
    return 0;
}
#包括
#包括
char*getSegment(char*symbol2,char*symbol3,char*filename){
if(strcmp(symbol2,“static”)==0)返回strcat(文件名,symbol3);
}
int main(){
char*symbol2=“静态”;
char*symbol3=“asdf”;
char*filename=“zxcn”;
printf(“%s\n”,getSegment(symbol2,symbol3,文件名));
返回0;
}

我正在尝试连接两个字符串并从函数返回连接的字符串。

尝试连接到文件名时:

return strcat(filename,symbol3)
您忘记了
filename
的大小为
5
。它没有更多空间供您连接字符

当你这样说的时候:

    char *filename="zxcn";

应将其分配为
常量字符*
。编译器应该警告您这一点,因为写入它是错误的。相反,您应该使用一些
char[]

您的
getSegment
函数本身没有什么问题,只是如果比较不是true,它不会返回有效字符串;相反,您给它一个无效的第三个参数(目标字符串)

filename
变量是指向长度为5个字符的常量的指针(4个可见字符加上
nul
终止符)。因此,它是:(a)不可修改的;和(b),即使是,也不足以容纳串联的结果

要解决此问题,请将
filename
声明为非常量字符数组,该数组足够大,可以存储串联结果。在下面的代码中,我允许最多10个字符(9加上终止符),这在您的示例中就足够了

要修复第一点,需要在
else
子句中返回一些内容

#包括
#包括
char*getSegment(char*symbol2,char*symbol3,char*filename)
{
if(strcmp(symbol2,“static”)==0)返回strcat(文件名,symbol3);
else返回文件名;//返回未修改的源字符串
}
int main()
{
char*symbol2=“静态”;
char*symbol3=“asdf”;
char filename[10]=“zxcn”;//非常量且足够大!
printf(“%s\n”,getSegment(symbol2,symbol3,文件名));
返回0;
}

但是,请注意,此处的
getSegment
函数修改给定的
filename
参数(这是问题的原因)。如果您想让它创建一个新字符串(从串联或只是原始字符串的一个副本),那么您必须自己分配该新字符串(并且您需要
释放
中的内存)

#包括
#包括
#包括
char*getSegment(char*symbol2,char*symbol3,char*filename)
{
如果(strcmp(symbol2,“静态”)==0){
char*answer=malloc(sizeof(char)*(strlen(filename)+strlen(symbol3)+1));
strcpy(应答,文件名);
strcat(应答,符号3);
返回答案;
}
否则{
返回strdup(文件名);
}
}
int main()
{
char*symbol2=“静态”;
char*symbol3=“asdf”;
char*filename=“zxcn”;
char*result=getSegment(symbol2,symbol3,文件名);
printf(“%s\n”,结果);
自由(结果);
返回0;
}