根据所提供的分解字符对目标字符串进行分解-----strtok()、strtok_r()

#include <string.h>
    char *strtok(char *str, const char *delim);
    描述:这个函数将一个字符串分解成0字节或者非空符号序列。
    参数:
    str:第一次调用strtok(),待分解的字符串需要通过参数str指定。如果分解后的子序列需要再次分解,则后续调用strtok()的时候,str需要被指定为NULL(待分解的字符串)。
    delim:指定了一组用于分解字符串的符号。对于同一个字符串,调用者可以指定多个不同的分解符号(分解符号组)。
    返回值,类型:char *
    每次调用strtok()返回指向一个以空字符结尾的字符串的首地址。字符串的内容是从字符串起始的位置到这次找到的分解字符的位置,由于strtok()会将分解字符使用'\0'代替,所以返回的字符串中是不包含分解字符的。如果字符串中找不到分解字符,则strtok()就会返回NULL;
    对一个待分解的字符串操作strtok()时,只维护一个指针,这个指针的起始地址由下一个非分解字符的位置决定。第一次调用strtok()的时候,指针是放在待分解的字符串的起始地址。如果在后续的字符串中再也找不到非分解符号的字符时,strtok()将返回NULL;
    每一次扫描将找到的分解符号使用'\0'代替,然后strtok()会将空字符串前面部分返回,再选择空字符的后续字符作为下一次分解的起始地址。
    如果存在多个分解符号连在一起的情况,strtok()会忽略这些连着的分解符号。
        例如:
            待分解字符串 abc::def
            分解字符 : 
            结果 abc def NULL
----------           
    char *strtok_r(char *str, const char *delim, char **saveptr);
    这个函数时strtok()的可重入版本,意味着是线程安全的,它的最后一个参数,保存着每一次字符串分解之后未返回的那一部分。
    参数:
    saveptr:第一次调用strtok_r()的时候,这个参数会被忽略,但是后续调用的时候这个参数不能为空。


    使用这两个函数的时候,必须要知道:
    1、会该表原字符串
    2、不能使用常字符串作为参数
    3、源字符串中的分解符号会被'\0'替换
    4、strtok()函数,不可重入,不是线程安全的。如果再多线程下有需要,可以采用strtok_r()

以下程序是上述函数的演示:

#include <string.h>
#include <iostream>
using namespace std;
int main(int argc,char *argv[]){
        if(argc != 3){
                cout << "please enter string and limiter" << endl;
                return -1;
        }
        char **buffer = new char*(NULL);
        for(char *substr = strtok_r(argv[1],argv[2],buffer);
                        NULL != substr; substr = strtok_r(NULL,argv[2],buffer)){
                cout << "substr:" << substr << endl;
                cout <<  "buf:" << *buffer << endl;
        }
        delete buffer;
        buffer = NULL;
        return 0;
}
----------
linxin@ubuntu:~/Library$ a.out abc.def.ghe.ijk .
substr:abc
buf:def.ghe.ijk
substr:def
buf:ghe.ijk
substr:ghe
buf:ijk
substr:ijk
buf:

猜你喜欢

转载自blog.csdn.net/displaymessage/article/details/80876432