• 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  ************
  • 相关阅读:
    CCF 201712-4
    图论_最短路径
    图论_查并集
    let和const
    Promise
    实现表单label两端对齐
    始终让footer在底部
    react——使用this.setState({ })修改state状态值
    react——css样式
    react脚手架
  • 原文地址:https://www.cnblogs.com/dhhu007/p/16067324.html
Copyright © 2020-2023  润新知