场景:
1.在存储数据时有时接口需要合并字符串值,并以某些特殊字符来合并部分,到需要的时候再分割它。如一些数值,人名等。
2.C++有strtok,stringstream和find函数来实现分割。可以根据情况调用。
void SplitWithFlag(const char* str1,char c,std::vector<std::string>& arr) { std::stringstream ss(str1); string str; while(getline(ss,str,c)) { arr.push_back(str); } }
20150709:增加模板方式实现
template<class T,typename C> std::vector<T> SplitChar(T& str,C c) { std::vector<T> temp; typedef std::basic_stringstream<C, std::char_traits<C>,std::allocator<C> > mstringstream; mstringstream mss; mss << str; T s; while(getline(mss,s,c)) { temp.push_back(s); } return temp; }
调用方式:
TEST(test_AndroidAssistant,SplitChar) { std::wstring str(L"afdadsfasd\nasdfasdfa\nasdfasdf"); std::vector<std::wstring> arr = SplitChar(str,L'\n'); for(int i = 0;i < arr.size();++i) { std::wcout << arr[i] << std::endl; } std::cout << "................." << std::endl; std::string str1("afdadsfasd\nasdfasdfa\nasdfasdf"); std::vector<std::string> arr1 = SplitChar(str1,'\n'); for(int i = 0;i < arr1.size();++i) { std::cout << arr1[i] << std::endl; } }
#include <stdlib.h> #include <string.h> #include <assert.h> #include <iostream> #include <sstream> #include <vector> using namespace std; void TestStrtok() { //1.非线程安全的,如果多个线程同时调用,会覆盖掉原来的值. //2.支持以字符串分割. //3.源字符串必须是可修改的. char c_str[]="google||twitter||facebook||microsoft||apple||ibm||"; const char* delim = "||"; char* result = strtok(c_str,delim); while(result != NULL) { cout << result << endl; result = strtok(NULL,delim); } } void TestGetLineWithStringStream() { //1.线程安全的,但是只能以字符作为分隔符 stringstream ss("google|twitter|facebook|microsoft|apple|ibm|"); string str; while(getline(ss,str,'|')) { cout << str << endl; } } void TestStringFind() { //1.自己实现,线程安全,支持字符串作为分隔符.缺点可能就是代码量多. string str = "google||twitter||facebook||microsoft||apple||ibm||"; const char* delim = "||"; const int len = strlen(delim); size_t index = 0; size_t pos = str.find(delim,index); while(pos != string::npos) { string ss = str.substr(index,pos-index); cout << ss << endl; index = pos+len; pos = str.find(delim,index); } //cout << "is last?" << " index:" << index << " str.length():" << str.length() << endl; if((index+1) < str.length()) { string ss = str.substr(index,str.length() - index); cout << ss << endl; } } int main(int argc, char const *argv[]) { cout << "TestStrtok: " << endl; TestStrtok(); cout << "TestGetLineWithStringStream: " << endl; TestGetLineWithStringStream(); cout << "TestStringFind: " << endl; TestStringFind(); return 0; } //参考: 1.http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c
输出:
TestStrtok: google twitter facebook microsoft apple ibm TestGetLineWithStringStream: google twitter facebook microsoft apple ibm TestStringFind: google twitter facebook microsoft apple ibm [Finished in 0.2s]