2010-03-04 68 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