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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值