在C语言中将字符串拆分为双指针

在C语言中将字符串拆分为双指针,c,pointers,strtok,C,Pointers,Strtok,我试图将一个字符串(例如:“hey there mister”)转换为指向句子中每个单词的双指针。 所以:拆分字符串->,指针1,指针2,指针3,其中指针1->“嘿”,指针2->“那里”和指针3->“先生” char**split(char*s){ char**nystreng=malloc(strlen); char str[strlen(s)]; int i; 对于(i=0;i

我试图将一个字符串(例如:“hey there mister”)转换为指向句子中每个单词的双指针。 所以:拆分字符串->,指针1,指针2,指针3,其中指针1->“嘿”,指针2->“那里”和指针3->“先生”

char**split(char*s){
char**nystreng=malloc(strlen);
char str[strlen(s)];
int i;
对于(i=0;i

我的问题是,为什么这不起作用

你需要做两件事-

char str[strlen(s)];  //size should be equal to strlen(s)+1
额外的
1
用于
'\0'
。现在将
str
(未以
'\0'
结尾)传递到
strtok
,这会导致未定义的行为


其次,您还需要为
nystring
的每个指针分配内存,然后使用
strcpy
而不是指向
temp
(不要忘记nul终止符的空间)

您的代码有多个问题。其中:

  • char**nystreng=malloc(strlen)是错误的。您需要的空间量是
    char*
    的大小乘以字符串将拆分成的数字段加上一(对于空指针终止符)

  • 您可以使用从本地数组
    str
    上操作的
    strok()
    获取的指针填充
    *nystreng
    。这些指针仅在
    str
    的生存期内有效,该生存期在函数返回时结束

  • 您没有在
    str
    中为字符串终止符分配空间,也没有编写字符串终止符,但将其传递给
    strtok()
    ,就像它是一个终止的字符串一样

  • 在标记化循环中,您不会递增
    teller
    ,因此每个标记指针都会覆盖上一个标记指针

这里有一个基本的问题,在分开绳子之前,你不知道会有多少块。不过,您可以通过计算分隔符的数量并添加1来获得其上限。然后可以为多个
char
指针加上一个指针分配空间。或者,您可以构建一个链表,在标记化时处理这些片段,然后仅在知道有多少片段后分配结果数组

至于
str
,如果您想返回指向它的指针,显然您是这样做的,那么它也需要动态分配。如果您的平台提供了
strdup()
,那么您可以使用

char *str = strdup(s);
否则,您需要检查长度,使用
malloc()
分配足够的空间(包括用于终止符的空间),并将输入字符串复制到分配的空间中,可能使用
strcpy()
。通常情况下,您希望在之后释放字符串,但如果要将指针返回到该空间,则不能这样做


另一方面,您可能会考虑返回一个可以单独释放的字符串数组。为此,您必须单独分配每个子字符串(
strdup()
如果您拥有它,它将再次成为您的朋友),并且在这种情况下,您希望释放工作空间(或者如果您使用VLA,则允许它自动清理)。

在您的程序中,它在哪一点上没有完成您认为它正在做的事情?请告诉我们是什么“不起作用”在这里的意思是。你得到了什么输出?一开始,这看起来非常可疑:
char**nystreng=malloc(strlen(s));
。不清楚为什么所需的空间将等于
s
的长度,并且与
char*
的大小无关返回不包含终止nul字符的长度。这意味着您的“for”循环没有复制终止符,因此strtok将离开缓冲区的末尾,在这一点上通常会发生不好的事情。此外,为什么要使用for循环手动复制字符串?请使用类似
strcpy
strncpy
的API。
char *str = strdup(s);