2014-01-24 33 views
1

我想使用strtok分解一個字符串並將提取的字符串存儲到新的數組中,以便我可以單獨使用它們作爲命令或其他內容。如何使用strtok分隔和獲取新字符串

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

main() 
{ 

    char test_string[50]="string to split up"; 
    char *sub_string; 

    /* Extract first string */ 
    printf("%s\n", strtok(test_string, " ")); 

    /* Extract remaining strings */ 
    while ((sub_string=strtok(NULL, " ")) != NULL) 
    { 
     printf("%s\n", sub_string); 
    } 
} 

這打印出我無空格尋找的字符串,但我將如何去獲得每一個保存到單獨的字符串變量,而不是隻打印他們的話嗎?基本上我想把「string」保存到string1 []和「to」中保存在string2 []等等。

回答

1

原始字符串被「切成片」,由strtok操作,所以你其實可以做到以下幾點:

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

int main(void) 
{ 

    char test_string[50]="string to split up"; 
    char *sub_string[50]; 
    int ii = -1; 
    /* Extract first string */ 
    sub_string[++ii]=strtok(test_string, " ")); 
    printf("%s\n", sub_string[0]); 
    /* Extract remaining strings */ 
    while ((sub_string[++ii]=strtok(NULL, " ")) != NULL) 
    { 
     printf("%s\n", sub_string[ii]); 
    } 
} 

基本上,strtok插入'\0'在發現分隔符,並返回一個指針開始的令牌。所以你實際上並不需要分配新的內存給sub_string元素 - 僅僅是陣列。我將數組的元素數量設置爲50;在現實中,你會想要確保你運行的空間在你while循環停止...

小圖可以幫助:

原始字符串:

s t r i n g t o s p l i t u p \0 

第一次調用strtok後:

s t r i n g \0 t o s p l i t u p \0 

^ first pointer 

下一個電話後:

s t r i n g \0 t o \0 s p l i t u p \0 

      ^second pointer 

第三個電話後:

s t r i n g \0 t o \0 s p l i t \0 u p \0 

        ^third pointer 

如果你想存儲在「不同的變量」的子串(不知道你爲什麼不考慮sub_string[0]sub_string[1]等,以方便「不同的變量」,但我會離開,對於另一時間),你可以以上更改爲:

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

int main(void) 
{ 

    char test_string[50]="string to split up"; 
    char *string1, *string2, *string3, *string4, *string5; 
    int n = 0; 
    /* Extract first string */ 
    if(strlen(test_string)==0) return 0; 

    string1=strtok(test_string, " ")); 
    n++; 
    printf("%s\n", string1); 

    while(n < 5) { 
    string2 = strtok(NULL, " "); 
    if (string2 == NULL) break; else n++; 
    string3 = strtok(NULL, " "); 
    if (string3 == NULL) break; else n++; 
    string4 = strtok(NULL, " "); 
    if (string4 == NULL) break; else n++; 
    string5 = strtok(NULL, " "); 
    if (string4 == NULL) break; else n++; 
    } 
    printf("the total number of strings found is %d\n", n); 
} 

我只是覺得它不如使用char *的數組那麼優雅。你能看到我的觀點嗎?

+0

謝謝@弗洛里斯。這真的清除了我對strtok實際工作原理的理解。然而,我編輯了關於如何將字符串的每個部分保存爲多個字符串變量的問題,但對於我的問題我有點不清楚。 但是我有一個關於你的代碼的問題。你聲明瞭ii = -1,當它第一次被調用爲++ ii時,它的值在代碼中的那一點已經變爲0,但是當在循環中調用++ ii時,它的值不應該是1這次叫它? P.S:我如何突出我在評論部分寫的功能? –

+0

@ArmanIqbal - 沒問題。要突出顯示註釋中的代碼,請使用反引號括起來:'''code \''。我以'ii = -1;'開始,所以當我第一次增加它的時候它就是'0'(對於字符串數組中的第一個元素);然後我繼續增加,所以我可以使用它(增量後)打印出來。我會在更新答案時解決您的其他問題。 – Floris

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

main() 
{ 

    char test_string[50]="string to split up"; 
    char *sub_string; 
    char withoutspace[50]; 

    /* Extract first string */ 
    printf("%s\n", strtok(test_string, " ")); 

    /* Extract remaining strings */ 
    while ((sub_string=strtok(NULL, " ")) != NULL) 
    { 
     strcat(withoutspace, sub_string); //printf("%s\n", sub_string); 
    } 
} 
相關問題