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

来源:互联网 发布:王尼玛有没有开淘宝店 编辑:程序博客网 时间:2024/06/05 05:11

以前还真没在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库,真不能用也别随便从网上拷代码,质量没保证啊。比如上面这块代码。