2010-04-10 76 views
6

好的。例如,我有這條線在我的txt文件:雙重分割C

1|1,12;7,19;6,4;8,19;2,2
正如你所看到的,它有2個部分,由|分離。使用;分隔符來分離第二部分1,12;7,19;6,4;8,19;2,2沒有問題。但我有進一步分開,以獲得每組的第一個和第二個數字的問題。

這是我當前的代碼:

result = strtok(result, ";"); 

    while(result != NULL) { 
     printf("%s\n", result); 
     result = strtok(NULL, ";"); 
    } 

它輸出我:

1,12
7,19
6,4
8,19
2,2

好,很好。但是,當我嘗試「的strtok」(我使用分裂此方法) 這樣的:

result = strtok(result, ";"); 

while(result != NULL) { 
    //printf("%s\n", result); 
    help = strtok(result, ",");  
    while(help != NULL) { 
     printf("<%s>", help); 
     help = strtok(NULL, ","); 
    } 

    result = strtok(NULL, ";"); 
} 

我只得到「< 1>,< 12>」好像有這一套只有一組數字。我不明白其餘的數字在哪裏。相反,輸出應該是:< 1>,< 12>,< 7>,< 19>,< 6>,< 4>,< 8>,< 19>,< 2>,< 2>。有人可以給一個解決方案,如何獲得每個設置這組數字的每個數字。也許還有其他方法或我做錯了什麼:)

謝謝!

回答

2

char * strtok(char * str,const char * delim);(來自手冊頁)
分隔符參數指定一組字符,用於分隔已分析字符串中的分隔符。調用者可以在解析相同字符串的連續調用中指定delim中的不同字符串。

因此,使用;,作爲分隔符來獲取所有數字。

//this will delimit result whenever ";" or "," is found 
result = strtok(result, ";,"); 

while(result != NULL) { 
    printf("%s\n", result); 
    result = strtok(NULL, ";,"); 
} 
1

第一個strtok將原始文件拆分爲幾個以null結尾的字符串。第二個strtok僅適用於這些字符串中的第一個 - 它停在由第一個strtok調用創建的第一個空終止符處。您需要爲每個由第一個創建的字符串調用第二個strtok代碼。

5

除了Neil指出的關於修改原始字符串的內容之外,strtok()函數的設計並非像您所描述的那樣以嵌套方式使用。您可能希望調查strtok_r()功能,或者完全避免使用strtok*系列。

+0

+1,用於指向嵌套的限制。 – codaddict 2010-04-10 09:49:39

0

C的strtok是非常邪惡的,因爲它修改源字符串,插入NULL代替分隔符。因此,當第二個循環到達由外部循環插入的NULL時,它停止。你想要的是將指針分別保存到你的;分隔的字符串中,然後分別將strtok分別保存。

或者,如果您確實想要使用嵌套循環,see here

+0

哇。多謝你們!很棒!從來沒有想過這麼簡單。 – Dmitri 2010-04-10 12:17:35

0

正如其他人指出的那樣,strtok()不是可重入的 - 它維護關於它正在解析的字符串的內部狀態,所以它不能用於同時解析兩個不同的字符串(這意味着它的兩個不同的非NULL值第一個參數,所以你的情況很重要)。

如果你有重入版本strtok_r()可用,你可以改變你的代碼中使用它,像這樣:

char *st_result, *st_help; 
result = strtok_r(result, ";", &st_result); 

while (result) { 
    printf("[%s]", result); 
    help = strtok_r(result, ",", &st_help);  
    while (help) { 
     printf("<%s>", help); 
     help = strtok_r(NULL, ",", &st_help); 
    } 

    result = strtok_r(NULL, ";", &st_result); 
}