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中出现的不连续分解字符都改写为‘’, 连续的分割符被认为是一个,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
", 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
", j, token);

        for(str2 = token;; str2 = NULL)
        {
            subtoken = strtok_r(str2, argv[3], &saveptr2);
            if(subtoken == NULL)
            {
                break;
            }
            printf("	 --> %s
", 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,";"))
原文地址:https://www.cnblogs.com/embedded-linux/p/6107540.html