[C/C++标准库]_[初级]_[分割字符串Split]


场景:

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]



你可能感兴趣的:(C++,字符串,split,分割,stringstream)