以下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;
}
我正在尝试串联两个字符串,并从函数返回串联的字符串。 最佳答案
您的getSegment
函数本身没有任何问题,除了以下事实:如果比较为而不是 true,则它不会返回有效的字符串;相反,您给它提供了无效的第三个参数(目标字符串)。filename
变量是一个指向常量字符串文字的指针,该字符串文字的长度为5个字符(4个可见的字符加上nul
终止符)。因此,它是:(a)不可修改; (b)即使是,它也不够大,无法容纳串联的结果。
要解决此问题,请将filename
声明为一个非常大的字符数组,该数组足以存储串联的结果。在下面的代码中,我最多允许10个字符(9个加上终止符),在您的示例中就足够了。
要解决第一点,您需要在else
子句中返回一些内容。
#include <stdio.h>
#include<string.h>
char* getSegment(char* symbol2, char* symbol3, char* filename)
{
if (strcmp(symbol2, "static") == 0) return strcat(filename, symbol3);
else return filename; // return unmodified source string
}
int main()
{
char* symbol2 = "static";
char* symbol3 = "asdf";
char filename[10] = "zxcn"; // Both NON-CONSTANT and LARGE ENOUGH!
printf("%s\n", getSegment(symbol2, symbol3, filename));
return 0;
}
但是,请注意,此处的
getSegment
函数会修改给定的filename
参数(这是导致问题的原因)。如果您希望它创建一个新的字符串(来自串联或只是原始字符串的副本),则您必须自己分配该新字符串(并且当您处于完成)。#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* getSegment(char* symbol2, char* symbol3, char* filename)
{
if (strcmp(symbol2, "static") == 0) {
char* answer = malloc(sizeof(char) * (strlen(filename) + strlen(symbol3) + 1));
strcpy(answer, filename);
strcat(answer, symbol3);
return answer;
}
else {
return strdup(filename);
}
}
int main()
{
char* symbol2 = "static";
char* symbol3 = "asdf";
char* filename = "zxcn";
char* result = getSegment(symbol2, symbol3, filename);
printf("%s\n", result);
free(result);
return 0;
}
关于c - 无法连接两个字符串并从函数返回它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/65061515/