strtok&strsep

strtok,strtok_r,strsep--extract tokens from strings

Tje strsep() function was introduced as a replacement for strtok, since the latter cannot handle empty fileds. However, strtok conforms to C89/C99 and hence is more portable.

#include <string.h>

char *strtok(char *str, const char *delim);

char *strtok_r(char *str, const char *delim, char **saveptr);  可重入

char *strsep(char **stringp, const char *delim);

根据delim字符串分解str。

saveptr用于保存每次调用完参数后下一次进行字符串分割时的起始地址,内部设定。

delim可为多个字符,每个字符都分解str,str中出现的不连续分解字符都改写为‘\0’, 连续的分割符被认为是一个,str中开始和结束的分隔符被忽略。

strtok使用:1)首次调用分割字符串参数为str,之后都为NULL。

2)返回NULL或分割字符串(不包含delim字符)

strtok_r使用:1)首次调用str指向要分割的字符串,saveptr忽略;接下来调用中str为NULL,saveptr应该不改变。

2)不同字符串可以同时被解析,指定不同saveptr参数。

使用注意:1)函数修改第一个参数str。

2)str不能是常量string。

3)strtok()用到静态buffer,因此非线程安全。

man中提供的一个例程

#include <stdio.h>
#include <stdlib.h>
#include <string.h> int main(int argc, char **argv)
{
char *str1, *str2, *token, *subtoken;
char *saveptr1, *saveptr2;
int j; if(argc != )
{
fprintf(stderr, "Usage: %s string delim subdelim\n", argv[]);
exit(EXIT_FAILURE);
} for(j = , str1 = argv[]; ; j++, str1 = NULL)
{
token = strtok_r(str1, argv[], &saveptr1);
if(token == NULL)
{
break;
}
printf("%d: %s\n", j, token); for(str2 = token;; str2 = NULL)
{
subtoken = strtok_r(str2, argv[], &saveptr2);
if(subtoken == NULL)
{
break;
}
printf("\t --> %s\n", subtoken);
}
} exit(EXIT_FAILURE); return ;
}
~$./a.out 'a/bbb///cc;xxx:yyy:' ':;' '/'
: a/bbb///cc
--> a
--> bbb
--> cc
: xxx
--> xxx
: yyy
--> yyy

strsep与strtok等同,与strtok相比,strsep可以处理空字符串。

If  *stringp is NULL, the strsep() function returns NULL and does nothing else.

char *ptr;
char *now_ptr;
for (ptr = strsep(&now_ptr,";"); ptr != NULL; ptr = strsep(&now_ptr,";"))
上一篇:libevent (二) 接收TCP连接


下一篇:NPOI 读写Excel