zoukankan      html  css  js  c++  java
  • 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,";"))
  • 相关阅读:
    利用智能手机(Android)追踪一块磁铁(三)
    利用智能手机(Android)追踪一块磁铁(二)
    利用智能手机(Android)追踪一块磁铁(一)
    android音频发生器
    接口的作用(java)
    Botposter.com集群ETCD2.3.7升级至3.0实录[原创]
    springboot2+jpa+hikari+oracle实战
    Nginx配置详解
    Nginx安装启动+springboot项目实现负载均衡实战
    springboot使用websocket进行实时传送信息实战(包含服务端和客户端)
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/6107540.html
Copyright © 2011-2022 走看看