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);
}