关于傻冒的strtok不能正确拆分连续分割符的解决方法
这几天接了个活,是和服务器搞交互的,比较简单,返回给我的值是一个逗号分割的字符串。我的工作是
把这个串拆开,写到本地数据库里去。
听起来没难度吧,当时我也是这样想的,就答应了。但是没想到这个工作还是给我出了道小难题。
第一,环境是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也都是一样的了。
当然,这个也是有隐患的,你要保证,插入的替换空串,不要和真实数据混淆,用一个乱字符串常量也许是个不错的选择。