split string 的c++实现

//-----------------------------------------------------------
// 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& results, bool empties = true)
{
char* pstr = const_cast(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& 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 &split_string(char  * str_in, const char * delim, std::vector &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; 
}

你可能感兴趣的:(小众工具)