您的位置:首页 > 编程语言 > C语言/C++

C++ 又一个字符串分割算法

2017-01-09 18:04 375 查看
字符串分割的算法,有很多种方式,但是下面这种方式并不是很常见:

strutility.hpp内容如下:

#pragma once
#include <functional>//not1、ptr_fun
#include <algorithm>//find_if
#include <string>
#include <vector>

inline std::string& lTrim(std::string &ss)
{
std::string::iterator p = find_if(ss.begin(), ss.end(), std::not1(std::ptr_fun(isspace)));
ss.erase(ss.begin(), p);
return ss;
}

inline std::string& rTrim(std::string &ss)
{
std::string::reverse_iterator p = find_if(ss.rbegin(), ss.rend(), std::not1(std::ptr_fun(isspace)));
ss.erase(p.base(), ss.end());
return ss;
}

inline std::string& trim(std::string &st)
{
lTrim(rTrim(st));
return st;
}

//将一个以par分割的整个字符串,分割以后存到vec里面
std::vector<std::string> split_string(std::string str, std::string par)
{
std::vector<std::string> vec;
vec.clear();
std::string::size_type pos=0, prev_pos=0;//查找到的位置和前一个位置

//处理并没有分割符的情况
if(str.find(par,0) == std::string::npos)
{
if(!trim(str).empty())
vec.push_back(trim(str));
return vec;
}

std::string strtmp;
for( pos=str.find(par,0); pos!=std::string::npos; prev_pos=pos+par.size(), pos=str.find(par,pos+par.size()) )
{
strtmp = str.substr(prev_pos, pos-prev_pos);
if(!trim(strtmp).empty())
vec.push_back(strtmp);
}
strtmp = str.substr(prev_pos, pos-prev_pos);
if(!trim(strtmp).empty())
vec.push_back(strtmp);

return vec;
}


测试代码:

#include <iostream>//cout、endl
#include <sstream>//stringstream
#include <string>
#include "strutility.hpp"

int main()
{
std::string str = "ABC|123|DEF|456";
std::cout << "分割前字符串: " << str << std::endl;

std::stringstream ss;
std::vector<std::string> vec = split_string(str, "|");
for(int i=0; i!=vec.size(); ++i)
{
if (i != vec.size()-1)
{
ss << vec[i] << "、";
}
else
{
ss << vec[i] << "。";
}
}
std::string strsub = ss.str();
std::cout << "分割后的子串 : " << strsub << "\r\n" <<std::endl;

system("pause");
return 0;
}


输出结果:

ABC、123、DEF、456。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐