// StrT: Type of string to be constructed
// Must have char* ctor.
// str: String to be parsed.
// delim: Pointer to delimiter.
// results: Vector of StrT for strings between delimiter.
// empties: Include empty strings in the results.
// http://www.codeproject.com/Articles/1114/STL-Split-String
//-----------------------------------------------------------
template< typename StrT >
int split(const char* str, const char* delim,
vector<StrT>& results, bool empties = true)
{
char* pstr = const_cast<char*>(str);
char* r = NULL;
r = strstr(pstr, delim);
int dlen = strlen(delim);
while( r != NULL )
{
char* cp = new char[(r-pstr)+1];
memcpy(cp, pstr, (r-pstr));
cp[(r-pstr)] = '\0';
if( strlen(cp) > 0 || empties )
{
StrT s(cp);
results.push_back(s);
}
delete[] cp;
pstr = r + dlen;
r = strstr(pstr, delim);
}
if( strlen(pstr) > 0 || empties )
{
results.push_back(StrT(pstr));
}
return results.size();
}
===================================================
另一个针对std::string的实现,简洁
void splitString2 (std::string& inputStr, char splitChar, std::vector<std::string>& outStrVec)
{
std::string::size_type loc_start = inputStr.find_first_not_of(splitChar);
std::string::size_type loc_stop = loc_start;
while(loc_stop != std::string::npos)
{
loc_stop = inputStr.find_first_of(splitChar, loc_start);
if (loc_stop != std::string::npos)
outStrVec.push_back(inputStr.substr(loc_start, loc_stop - loc_start));
else
outStrVec.push_back(inputStr.substr(loc_start));
loc_start = inputStr.find_first_not_of(splitChar, loc_stop);
loc_stop = loc_start;
}
};
======================================================
基于strtok的实现
std::vector<char *> &split_string(char * str_in, const char * delim, std::vector<char *> &elems)
{
assert(str_in != NULL);
char *token;
token = strtok(str_in,delim);//split string
while(token)
{
elems.push_back(token);
token = strtok(NULL,delim);//next split string
}
return elems;
}