首页 > 代码库 > strtok&strsep
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 != 4) { fprintf(stderr, "Usage: %s string delim subdelim\n", argv[0]); exit(EXIT_FAILURE); } for(j = 1, str1 = argv[1]; ; j++, str1 = NULL) { token = strtok_r(str1, argv[2], &saveptr1); if(token == NULL) { break; } printf("%d: %s\n", j, token); for(str2 = token;; str2 = NULL) { subtoken = strtok_r(str2, argv[3], &saveptr2); if(subtoken == NULL) { break; } printf("\t --> %s\n", subtoken); } } exit(EXIT_FAILURE); return 0; }
~$./a.out ‘a/bbb///cc;xxx:yyy:‘ ‘:;‘ ‘/‘ 1: a/bbb///cc --> a --> bbb --> cc 2: xxx --> xxx 3: 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,";"))
strtok&strsep