其他分享
首页 > 其他分享> > C语言中strtok和strsep的区别

C语言中strtok和strsep的区别

作者:互联网

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

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

strtok和strsep均可用于str字符串的分割。

相同部分:

对该函数的调用序列将str拆分为token,这些token是由作为定界符一部分的任何字符分隔的连续字符的序列。

首次调用时,该函数需要一个C字符串作为str的参数,该字符串的第一个字符用作扫描令牌的起始位置。在随后的调用中,该函数需要一个空指针,并使用最后一个标记结束后的位置作为扫描的新起始位置。

为了确定token的开头和结尾,该函数首先从起始位置扫描未包含在定界符中的第一个字符(该字符成为token的开头)。然后从token的开头开始扫描定界符中包含的第一个字符,该字符成为token的末尾。如果找到终止的空字符,扫描也会停止。

token的此结尾将自动替换为空字符(NULL),并且token的开头由函数返回。

一旦在对strtok的调用中找到了str的终止null字符,此函数的所有后续调用(将null指针作为第一个参数)都将返回null指针。

找到下一个标记的点由在下一次调用时使用的函数在内部保留(不需要特殊的库实现来避免数据争用)。

因此,两者都会对原字符串进行修改。

不同部分:

1.strtok()和strsep()之间的主要区别在于strtok()是C标准的,因此也是通过POSIX);而strsep()不是标准化的(通过C或POSIX;它在GNU C中可用) 库,起源于BSD。

对于内核编程中,是没有strtok函数的,因此只能使用strtok。

2.strtok内部记录上次调用字符串的位置,所以是不可重入的,不支持多线的,其可重入版本为strtok_r。

strsep使用传入的参数来确定字符串的起始位置,是可重入的,也是Linux kernel推荐的函数,strtok的替代品。

3.当遇到多个连续的分隔符时,strtok会把这些多个连续的分割符当做一个来处理,而strsep会依次处理,会返回空字符串

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #include <stdio.h> #include <string.h>   #define STRING_FOR_TESTING "{0x1,0x2}, {{{{{{{{{{{{0x3,0x4}, {0x5,0x6},{0x7,0x8},{0x9,0x10},{0x11,0x12},{0x13,0x14}," int main() {     char input[] = STRING_FOR_TESTING;     char input_tok[] = STRING_FOR_TESTING;     char input_sep[] = STRING_FOR_TESTING;     char *token;     char *pCur;       printf("origin input: %s, size:%lu\n", input, sizeof(input));       printf("************ strtok start ************\n");     printf("input_tok=%p\n", input_tok);       token = strtok(input_tok, "{");     while (token != NULL)     {         printf("strtok:%s -- token=%p\n", token, token);         token = strtok(NULL, "{");     }       printf("now input: %85s, size:%lu\n", input_tok, sizeof(input_tok));       printf("************ strtok  end  ************\n");       printf("************ strsep start ************\n");       pCur = input_sep;     printf("input_sep=%p\n", input_sep);       token = strsep(&pCur, "{");     while (token != NULL)     {         printf("strsep:%s-- token=%p  pCur=%p\n", token, token, pCur);         token = strsep(&pCur, "{");     }       printf("now input: %85s, size:%lu\n", input_sep, sizeof(input_sep));       printf("************ strsep  end  ************\n");       return 0; }

 执行结果:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 origin input: {0x1,0x2}, {{{{{{{{{{{{0x3,0x4}, {0x5,0x6},{0x7,0x8},{0x9,0x10},{0x11,0x12},{0x13,0x14},, size:89 ************ strtok start ************ input_tok=0x7fffda95d200 strtok:0x1,0x2},  -- token=0x7fffda95d201 strtok:0x3,0x4},  -- token=0x7fffda95d217 strtok:0x5,0x6}, -- token=0x7fffda95d222 strtok:0x7,0x8}, -- token=0x7fffda95d22c strtok:0x9,0x10}, -- token=0x7fffda95d236 strtok:0x11,0x12}, -- token=0x7fffda95d241 strtok:0x13,0x14}, -- token=0x7fffda95d24d now input:                                                                           {0x1,0x2}, , size:89 ************ strtok  end  ************ ************ strsep start ************ input_sep=0x7fffda95d260 strsep:-- token=0x7fffda95d260  pCur=0x7fffda95d261 strsep:0x1,0x2}, -- token=0x7fffda95d261  pCur=0x7fffda95d26c strsep:-- token=0x7fffda95d26c  pCur=0x7fffda95d26d strsep:-- token=0x7fffda95d26d  pCur=0x7fffda95d26e strsep:-- token=0x7fffda95d26e  pCur=0x7fffda95d26f strsep:-- token=0x7fffda95d26f  pCur=0x7fffda95d270 strsep:-- token=0x7fffda95d270  pCur=0x7fffda95d271 strsep:-- token=0x7fffda95d271  pCur=0x7fffda95d272 strsep:-- token=0x7fffda95d272  pCur=0x7fffda95d273 strsep:-- token=0x7fffda95d273  pCur=0x7fffda95d274 strsep:-- token=0x7fffda95d274  pCur=0x7fffda95d275 strsep:-- token=0x7fffda95d275  pCur=0x7fffda95d276 strsep:-- token=0x7fffda95d276  pCur=0x7fffda95d277 strsep:0x3,0x4}, -- token=0x7fffda95d277  pCur=0x7fffda95d282 strsep:0x5,0x6},-- token=0x7fffda95d282  pCur=0x7fffda95d28c strsep:0x7,0x8},-- token=0x7fffda95d28c  pCur=0x7fffda95d296 strsep:0x9,0x10},-- token=0x7fffda95d296  pCur=0x7fffda95d2a1 strsep:0x11,0x12},-- token=0x7fffda95d2a1  pCur=0x7fffda95d2ad strsep:0x13,0x14},-- token=0x7fffda95d2ad  pCur=(nil) now input:                                                                                      , size:89 ************ strsep  end  ************

标签:strtok,--,pCur,C语言,token,strsep,input
来源: https://www.cnblogs.com/dhhu007/p/16067324.html