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