您的位置:首页 > 编程语言 > C语言/C++

C++ 分割字符串的问题不少啊

2017-06-30 19:56 169 查看
以前还真没在C++下遇到过需要分割字符串的需求,想随手从网上的拷个split函数算了,结果找了几个都不满意,而且有些还是错的



如果不是特殊原因用不了boost库的话,我也不会这么干,结果百度一下算是开了眼了:

比如有些在函数内开了个char[]当buffer,用来把所有字符装进去,以便按字符查找——但是无论多长的字符串进来都要增加一倍的空间开销,这样真的好吗。

还有默认分隔符是一个字符的——形参给的是string,你能保证调用者只传一个字符的string吗。

还有使用str.find_first_of()函数的,这个函数只要有一个字符匹配就会给返回,当分割符的长度超过1的时候就乱了套了,我直接拷过来随便测了下程序崩溃了。

还有一个把传进来的原始字符串给改了的,调用者为了分割一个字符串结果函数出来后把原始的串都给丢了。

还有一个函数写的太长我没功夫看的。还有一个在函数内new出子串空间给调用者传指针的,可能觉得调用者必须知道函数的内部实现,并且有义务在用完后把这些指针都给释放掉。

还有用new_string=origin_string.substr()不停的把处理过的串去掉,再接着分析余下的串的,但是这样来回拷串不嫌浪费时间空间吗。

还有直接在原串上给指针,指向各节点给调用者的,调用者要是赋个值啥的就直接进来的原串给改啦。

不一而足。没想到一个split()方法居然暴露出这么多问题。所以写代码跟写能用的代码不是一回事。跟写好用的代码也不是一回事。

为什么吐槽这么多,是因为觉得这东西网上绝逼有现成好用的,结果看了7,8个函数最终还是得自己写。。

Java, Python都可以String.split(),所以一切安好,C++果然还是手动档,自己造了个轮子:

list<string> split(const string& str, const string& separator) {
list <string> result;
if (str.length() == 0)
{
result.push_back("");
return result;
}
int pos = 0;
int offset = 0 ;
while ((pos = str.find(separator, offset)) != string::npos)
{
string subs;
if (pos > 0)
{
subs = str.substr(offset, pos-offset);
result.push_back(subs);
} else if( pos==0) {
result.push_back("");
}
offset = pos + separator.size();
}
if (offset < str.size()) {
result.push_back(str.substr(offset, str.size()));
}
return result;
}
总结:能用boost库的用boost库,真不能用也别随便从网上拷代码,质量没保证啊。比如上面这块代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: