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,";"))
  • 相关阅读:
    Pytorch cpu版离线安装:win10 + Anaconda + Pip
    离线配置Opencv-python: Anaconda3 + Pycharm+ Win10 + Python3.6
    HSmartWindowControl 之 摄像头实时显示( 使用 WPF )
    OpencvSharp 在WPF的Image控件中显示图像
    HSmartWindowControl 之 显示图像
    HSmartWindowControl之安装篇 (Visual Studio 2013 & Halcon 18)
    使用ILMerge 打包C# 绿色免安装版程序
    C# 日志输出工具库—log4net 安装、配置及简单应用
    Python:windows下scikit-learn 安装和更新
    C# 开源仪表盘库—Agauge App
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/6107540.html
Copyright © 2011-2022 走看看