字符串分隔
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); }