C++ 分割字符串(纯C++实现)

本文介绍了一种不常见的字符串分割算法实现,通过使用C++标准库函数完成字符串的左右两端去除空白字符,并按指定分隔符分割字符串为多个子串。文章包含完整的代码示例及运行结果。

字符串分割的算法,有很多种方式,但是下面这种方式并不是很常见:

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。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值