c-无法连接两个字符串并从函数返回



下面的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("%sn",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("%sn", getSegment(symbol2, symbol3, filename));
return 0;
}

但是,请注意此处的getSegment函数修改了给定的filename参数(这是问题的原因(。如果你想让它创建一个新字符串(从串联或只是原始字符串的副本(,那么你必须自己分配这个新字符串(完成后,你需要在mainfree这个内存(。

#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("%sn", result);
free(result);
return 0;
}

当您尝试连接到文件名时:

return strcat(filename,symbol3)

你伪造了filename的大小是5。它没有更多的空间供您连接字符。

当你这样做时:

char *filename="zxcn";

应将其指定为const char*。编译器应该对此发出警告,因为写入它是UB。相反,您应该使用一些char[]

相关内容

  • 没有找到相关文章

最新更新