昨天在处理数据的时候需要对字符串进行分割提取信息,于是查阅了一些资料,发现一篇博文总结的很全面。于是转载了过来,稍有修改。
1.用STL进行字符串的分割
涉及到string类的两个函数find和substr:
(1)find函数
原型:size_t find ( const string& str, size_t pos = 0 ) const;
功能:查找子字符串第一次出现的位置。
参数说明:str为子字符串,pos为初始查找位置。
返回值:找到的话返回第一次出现的位置,否则返回string::npos
(2)substr函数
原型:string substr ( size_t pos = 0, size_t n = npos ) const;
功能:获得子字符串。
参数说明:pos为起始位置(默认为0),n为子字符串包含的字符个数(默认子字符串结束位置为npos)
返回值:子字符串
示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <iostream> #include <string> #include <vector> using namespace std; vector<string> split(string str, string pattern) { vector<string> result; str += pattern; //扩展字符串,方便输出分割后的最后一个字符串 string::size_type pos; string::size_type strsize = str.size(); for (string::size_type i = 0; i < strsize; ){ pos = str.find(pattern, i); if (pos < strsize){ string s = str.substr(i, pos - i); result.push_back(s); i = pos + pattern.size(); } } return result; } int main() { string str = "1|24|M|technician|85711"; string pattern = "|"; vector<string> result = split(str, pattern); //测试输出结果 for (vector<string>::iterator iter = result.begin(); iter != result.end(); ++iter) cout << *iter << endl; system("pause"); return 0; } |
输出结果:
1 2 3 4 5 6 |
1 24 M technician 85711 请按任意键继续. . . |
2.使用strtok函数
C中的字符串分割函数
原型: char *strtok(char *str, const char *delim);
功能:分解字符串为一组字符串。
参数说明:str为要分解的字符串,delim(delimiter缩写,分隔符、定界符)为分隔符字符串。
返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。
其它:strtok函数线程不安全,可以使用strtok_r替代
WARNING:第一种方法分割字符串时,pattern只是一个分隔符。而strtok可以实现多于一个分隔符的情况——如果传入delim的是一个字符串,则传入的字符串中的每个字符均为分隔符。
其他相关信息:Linux内核2.6.29后,这个函数不再使用了,由速度更快的strsep()代替。
3.boost库split函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <string> #include <vector> #include <boost/algorithm/string/classification.hpp> #include <boost/algorithm/string/split.hpp> using namespace std; int main() { string s = "sss/ddd,ggg"; vector<string> vStr; boost::split( vStr, s, boost::is_any_of( ",/" ), boost::token_compress_on ); for( vector<string>::iterator it = vStr.begin(); it != vStr.end(); ++ it ) cout << *it << endl; return 0; } |
参考:http://www.cnblogs.com/MikeZhang/archive/2012/03/24/mysplitfuncpp.html