码迷,mamicode.com
首页 > 其他好文 > 详细

strtok&strsep

时间:2016-11-27 23:33:36      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:安全   intro   字符串   接下来   char   ;;   extract   argc   strtok   

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

        for(str2 = token;; str2 = NULL)
        {
            subtoken = strtok_r(str2, argv[3], &saveptr2);
            if(subtoken == NULL)
            {
                break;
            }
            printf("\t --> %s\n", 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,";"))

 

strtok&strsep

标签:安全   intro   字符串   接下来   char   ;;   extract   argc   strtok   

原文地址:http://www.cnblogs.com/embedded-linux/p/6107540.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!