gpt4 book ai didi

c - 返回字符串的函数不工作 - 段错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:18:34 25 4
gpt4 key购买 nike

我有一个非常非常简单的函数,它给我带来了一些问题。我想要做的就是在从字符串更改后返回一个子字符串。但是当我运行代码时,我遇到了段错误。我的代码发生了什么:

#include <stdio.h>
#include <string.h>

const char *new_name(char str[])
{

char * pch;
char * last="";
char * pch2;
static char name[80];
printf ("Splitting string \"%s\" into tokens:\n",str);

pch = strtok (str,"/");
while (pch != NULL)
{
last=pch;
pch = strtok (NULL, "/");

}

pch2 = strtok (last,".");
strcpy(name, pch2);
strcat(name, ".ppm");

return name;
}

int main()
{
printf("New name: %s",new_name("/home/test/segmentation/test.pgm"));
return 0;

}

编辑:我还有一个问题:我想使用这个函数的返回作为另一个函数的输入,但它接受 char 并且返回的值是 const char。如何转化?

最佳答案

崩溃发生在 strtok 中。问题是您将指向字符串文字的指针作为其第一个参数传递,而字符串文字通常位于只读内存中,因此 strtok 在尝试更改字符串时崩溃。

char *strtok(char *str, const char *delim);

一种修复方法:

char fileName[] = "/home/test/segmentation/test.pgm";
printf("New name: %s",new_name(fileName));

编辑:在“编辑”下方回答您的问题。

只需更改函数的签名以返回 char *:

char *new_name(char str[])

不过,如果再多改一点就好了。与其使用本地静态缓冲区 (name),不如将缓冲区作为第二个参数传递,并在客户端代码中调用函数之前分配它。这种方法的问题是调用者通常不知道要生成的字符串的确切长度甚至最大长度。

另一个可能更好的选择是使用 malloc 分配要动态返回的缓冲区内存,并将指向它的指针返回给调用者。在这种情况下,释放缓冲区的责任将由用户代码承担,因此您应该正确记录它。

关于c - 返回字符串的函数不工作 - 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19769117/

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