字符串分隔

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

 

转载于:https://www.cnblogs.com/myJune/p/9089493.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值