gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:02:51 24 4
gpt4 key购买 nike

以下 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 没有问题函数本身,除了如果比较为 时它不返回有效字符串这一事实不是 真的;相反,你给它一个无效的第三个参数(目标字符串)。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论点(这是你的问题的原因)。如果您希望它创建一个新字符串(从连接或只是原始的副本),那么您必须自己分配该新字符串(并且您需要 free 中的 main 中的内存,当你完成它时)。
#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com