字符串分割一种时常会遇到的问题:下面列举几个函数 ,可以方便编程:
1.strtok函数进行字符串分割 ( 适合用于一次性分割 ,这个用得比较多)原型: char *strtok(char *str, const char *delim);
功能:分解字符串为一组字符串。
参数说明:str为要分解的字符串,delim为分隔符字符串。
返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。
例:
char ch[100]="zhangsan 20 male,lisi 20 male,xiaohong 19 female.";
char *c=ch;
int tot=0;
char *str[20];
while( (str[tot]=strtok(c,",."))!=NULL){
puts(str[tot++]);
c=NULL;
}
2:char *strtok_r(char *s, const char *delim, char **ptrptr); ( 适合一次性分割后还要二次分割等)(这个貌似在windows下米有,不过在linux内核中能找到源码 )
首先它和strtok区别是 :strtok 自己内置了一个指针,而且因为只有一个 先分割了外层的字符串,再分割内层时就会将外层的指针用于内层,而strtok_r 可以让用户自己提供一个指针代替内置指针, 因此:我们可以为外层先设置一个外层指针 再为内层设置一个内层指针,这样就完美的避免冲突了。
3:char *strtok_s( char *strToken, const char *strDelimit, char **context); (和2一样吧 这个是用于windows的,和2一样都是线程安全~~~)
例:
char buffer[]="zhangsan 20 male,lisi 20 male,xiaohong 19 female.",*buf=buffer;
char *str[20];
int tot=0;
char *outer_ptr=NULL;
char *inner_ptr=NULL;
while((str[tot]=strtok_s(buf,",.",&outer_ptr))!=NULL) {
buf=str[tot];
while((str[tot]=strtok_s(buf," ",&inner_ptr))!=NULL) {
tot++;
buf=NULL;
}
str[tot++]="***"; //这一句用来表示 外层分割
buf=NULL;
}
4: char *strsep(char **stringp, const char *delim); (windows下没有支持,在linux下使用,比strtok速度更快)
功能:分解字符串为一组字符串。从stringp指向的位置起向后扫描,遇到delim指向位置的字符后,将此字符替换为NULL,返回stringp指向的地址。
可以用find 配合substr 不过复杂度高不建议用
利用boost正则表达式分割
1和3用得比较多,其他有兴趣的可以在网上找找资料