split string 的c++实现

本文介绍三种不同的字符串拆分方法:一种通用模板函数适用于各种字符串类型,另一种针对std::string的简洁实现,最后一种利用strtok函数进行拆分。每种方法都有其应用场景,帮助开发者高效完成字符串处理任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//-----------------------------------------------------------
// 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; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值