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库,真不能用也别随便从网上拷代码,质量没保证啊。比如上面这块代码。
。
如果不是特殊原因用不了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库,真不能用也别随便从网上拷代码,质量没保证啊。比如上面这块代码。
相关文章推荐
- T-SQL 分割字符串问题汇总
- 标准C++ 与MFC 6.0 中字符串的分割
- 重写一个字符串分割函数 - 回复 "tomzw" 的问题
- 面试常见问题1: 字符串分割
- C/C++中的字符串分割
- 关于在lotus domino中分割字符串的问题!
- php下关于中英数字混排的字符串分割问题
- 关于split分割字符串,空结果不能得到的问题
- C#中解决在STRING.SPLIT()中不能用字符串分割另一字符串的问题
- java关于split分割字符串,空的字符串不能得到的问题
- JAVA分割字符串注意问题
- java关于split分割字符串问题
- java关于split分割字符串,空的字符串不能得到的问题
- 关于split分割字符串,空结果不能得到的问题
- 一个关于c++字符串处理和delete[]与delete差别的问题
- 从易到难编写C++程序,(1)问题:把键盘输入的字符串逆序输出。
- 关于split分割字符串,空结果不能得到的问题
- (转)java关于split分割字符串,空的字符串不能得到的问题
- 字符串分割的问题
- C++中使用指定字符分割字符串