2016-09-23 66 views
-3

我试图将一个字符串(例如:“嘿老总”)转换成三角形指向句子中的每一个字一个双指针。 so:split_string-> | pointer1 | pointer2 | pointer3 |其中pointer1 - >“hey”,pointer2 - >“there”和pointer3 - >“mister”。将一个字符串分解到双指针用C

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

    for(i = 0; i < strlen(s); i++){ 
     str[i] = s[i]; 
    } 

    char *temp; 
    temp = strtok(str, " "); 

    int teller = 0; 
    while(temp != NULL){ 
     printf("%s\n", temp); 
     nystreng[teller] = temp; 
     temp = strtok(NULL, " "); 
    } 
    nystreng[teller++] = NULL; 

    //free(nystreng); 

    return nystreng; 
} 

我的问题是,为什么不能正常工作?

+0

你的程序在哪一点上没有做到你认为正在做的事情? – RPGillespie

+0

请告诉我们在这种情况下“不工作”是什么意思。你得到什么输出? –

+2

直接蝙蝠,这看起来高度可疑:'char ** nystreng = malloc(strlen(s));'。目前还不清楚为什么所需的空间等于's'的长度并且与char *的大小无关。 –

回答

1

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

  • char **nystreng = malloc(strlen(s));是错的。你需要的空间大小是一个char *乘以字符串将被分割的数量加上一个(对于NULL指针终止符)。

  • 您填写*nystreng当地阵列str操作从strtok()获得的指针。这些指针仅在str的生命周期内有效,该函数在函数返回时结束。

  • 您不为str中的字符串终止符分配空间,并且您没有写入空格,但是您将它传递给strtok()就好像它是一个终止字符串。

  • 您不会在标记循环中增加teller,因此每个标记指针会覆盖前一个。

你有一个基本的问题,因为你不知道在拆分字符串之前会有多少块。你可以通过计数的分隔符的数量和增加1.然后,您可以为许多char指针加一分配空间仍然得到的是一个上限。或者,你可以建立一个链表来处理这些片段,然后在知道有多少片断之后才分配结果数组。

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

char *str = strdup(s); 

否则,您将需要检查的长度,用malloc()(包括终止空间)分配足够的空间,并且输入字符串复制到所分配的空间,推测与strcpy()。通常情况下,你会希望在之后释放字符串,但是如果你要返回指向该空间的指针,则不能这样做。

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

0

有你需要做两件事情 -

char str[strlen(s)]; //size should be equal to strlen(s)+1 

额外1'\0'。现在你通过str(不'\0'终止),以strtok导致未定义行为

而第二件事,你还需要分配内存的nystring每个指针,然后使用strcpy而不是指向temp不要忘记NUL终止空间)。