字符串分隔

1 引言

1.1 strtok

说到字符串分隔,通常都会想到strtok,不过strtok缺陷也比较多,比如

破坏原字串;(修改查到的分割字符串为‘\0’)

连续的字符串,strtok会跳过;(意思就是如 aaa,bbb,,ccc,中间连续两个,,直接跳过,不返回NULL,直接返回ccc的位置,但有时候业务需求需要判断这样的情况)

1.2 一个典型的场景

如文本的匹配,文本format as:  

/*******************************************

id,name,age,interest,from

“1,马云,18,,阿里巴巴"

*******************************************/

使用逗号提取,分别赋值给变量char* id,name,age,interest,from

假如使用strtok,interest会直接被赋值为"阿里巴巴",from就被不能被赋值了。

这里封装了一个接口,如果大家用得上,也是极好的。

//strsep是关键点,记得是内核中的一个字符串分隔的实现,不同于strtok,连续的两个字符串会返回NULL。美中不足的是,也会破坏原字串。
char* strsep(char **stringp, const char *delim) { char *s; const char *spanp; int c, sc; char *tok; if ((s = *stringp) == NULL) return (NULL); for (tok = s;;) { c = *s++; spanp = delim; do { if ((sc = *spanp++) == c) { if (c == 0) s = NULL; else s[-1] = 0; *stringp = s; return (tok); } } while (sc != 0); } /* NOTREACHED */ }
//封装一下赋值过程,简化调用,data是原字串,count是参数个数,可变参是待赋值的二级指针。 void x_strsep(char *data, int param_count, ...) { char **param; va_list vaptr; va_start(vaptr, param_count); while(param_count > 0) { param = va_arg(vaptr, char **); *param = strsep(&data, ","); //分隔字串忘记添加到函数参数中了,写得匆忙,见谅 param_count--; } }

//调用
int main(int argc, const char* argv[]) {  char str[256] = "1,./tempfile,hello,world"; char* stype, file, protovar, pattern; x_strsep(str, 4, &stype, &file, &protovar, &pattern); }

 

posted on 2018-05-25 16:49  myJune  阅读(293)  评论(0编辑  收藏  举报