关于傻冒的strtok不能正确拆分连续分割符的解决方法

RockWang2819 2008-10-22 08:43:09

这几天接了个活,是和服务器搞交互的,比较简单,返回给我的值是一个逗号分割的字符串。我的工作是

把这个串拆开,写到本地数据库里去。

听起来没难度吧,当时我也是这样想的,就答应了。但是没想到这个工作还是给我出了道小难题。


第一,环境是C++

第二,返回给我的穿里有空值


如果串是"a,b,c,d,e,f,g,h"这样的标准,相信大家拆起来都没有什么难度

但是如果串是"a,b,,d,e,,,h"这样呢?

strtok的工作原理是把连续的多个符号视为一个的,这和它是使用空格来替代拆分符号的工作机制有关的

,说实话我认为这绝对是一个BUG。那么多年还是没改,也不知道微软的家伙们在想什么。

P.S.CString的Tokenize()和strtok的处理方式也是一样的


上网找找解决方案吧,发现大家都是在自己写方法,而且效率也不是那么高。

那么就没有别的方法了么?


逆向思维一下吧,只要我们把要拆分的字符串标准化为没有连续分割符,这个问题不就解决了么?

相信很多人看到这里也就想到解决方法了,小弟不才,贴上一段代码,望大家批评指正。


int strIndex = -1;//连续分割符出现的位置
CString response = "a,b,,d,e,,,h";
const char* findStr = ",,";//你的分割符号,两个连续在一起哦
strIndex = response.Find(findStr,0);
while(strIndex != -1)//只要还有连续分割符,就一直执行下去
{
strIndex++;//位置加1,是要插入字符串的位置
response.Insert(strIndex,"null");//插入字符串
strIndex = response.Find(findStr,0);//继续找下一个连续分割符
}
MessageBox(response);


好了,去看看是不是你的字符串已经成为了没有连续分割符的标准串。

下面的工作,想用Tokenize还是strtok也都是一样的了。

当然,这个也是有隐患的,你要保证,插入的替换空串,不要和真实数据混淆,用一个乱字符串常量也许是个不错的选择。
...全文
1016 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
RockWang2819 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 RockWang2819 的回复:]
while循环里的
strIndex = response.Find(findStr,0);
理论上可以替换为
strIndex = response.Find(findStr,strIndex);

效率上还会高一些
[/Quote]

饿......推倒前言,strIndex = response.Find(findStr,strIndex);是有BUG的,在拆分多个连续的分割符时
RockWang2819 2008-10-22
  • 打赏
  • 举报
回复
while循环里的
strIndex = response.Find(findStr,0);
理论上可以替换为
strIndex = response.Find(findStr,strIndex);

效率上还会高一些
RockWang2819 2008-10-22
  • 打赏
  • 举报
回复
我这个方法只能说是取巧而已,并不算是标准的解决拆分问题。

不过吗,黑猫白猫,抓得到老鼠的是好猫。

而且不论是效率或者代码量,我想这个方法都还是可以接受的。

小弟很久不来,也没什么分,大家就当捧个人场吧。
开心爸爸84 2008-10-22
  • 打赏
  • 举报
回复
很好,up

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧