#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: