2010-03-04 70 views
4

我將一些C結構序列化爲字符串,而不是使用strtok()對其進行反序列化。但是,不幸的是,strtok()不檢測空字段(例如1:2 :: 4)。strtok()和空字段

有沒有其他功能?

回答

9

在linux上有strsep

的strsep()函數被引入 作爲的strtok()的替代品,因爲 後者不能處理空 字段。但是,strtok() 符合C89/C99,因此更便於攜帶。

+0

strsep()也是線程安全的(或可製成這種方式),其中的strtok()是非常非常。 – ceo 2010-03-04 18:37:10

6

您可以使用strchr(僅限一個分隔符)或strcspn(對於一組可能的分隔符)來查找下一個分隔符,處理該令牌,然後向前推送一個字符。做一個循環,你有你所需要的。

0

Drakosha給出了正確的答案。我想爲兩個變體添加一個示例。

隨着strtok的:

char *token; 
char *tmp_string; 
char delimiter[10] = " |,.:"; 
strcpy (tmp_string, "1:2::4"); 
token = strtok(tmp_string, delimiter); // first token 
while(token != NULL) { 
    i++; 
    printf ("i=%d\tToken: len(%d)\t%s", i, strlen(token), token); 
    // do something 
    token = strtok(NULL, delimiter); /* next token */ 
} 

隨着strsep(會識別 「」):

char *token; 
char *tmp_string; 
char delimiter[10] = " |,."; 
strcpy (tmp_string, "1:2::4"); 
token = strsep(&tmp_string, delimiter); // first token 
while(token != NULL) { 
    i++; 
    printf ("i=%d\tToken: len(%d)\t%s", i, strlen(token), token); 
    // do something 
    token = strsep(&tmp_string, delimiter); /* next token */ 
} 
+0

'char * tmp_string;' 'strcpy(tmp_string,「1:2 :: 4」);' 將導致內存問題... – karelv 2016-09-19 12:28:46