C 无法连接两个字符串并从函数返回它
下面的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
#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;
}