string字符串进行分割

c++标准库中,对string字符串并没有提供分割操作,需要自己手动实现此功能。

方式1:

      采用 std::stringstream 输入字符串,通过getline()函数,来对字符串进行分割。

#include <sstream>

void getSplit(std::string s, char cDelims, std::vector<std::string> & res)
{

	std::stringstream ss;
	ss << s;
	std::string t;
	while (getline(ss, t, cDelims))
		res.push_back(t);
}

int main()
{
	std::string TestList2 = "123/456//789/100";
	std::vector<std::string> strDest3;
	getSplit(TestList2,'/',strDest3);

    return 0;
}

输出结果:

方式二:

      采用string的成员方法,find() 和substr()来对字符串进行分割。

int getSplit(std::string strSource,std::vector<std::string>& strDest, const std::string& strDelims)
{
	strDest.resize(0);
	const char* pdelims = strDelims.c_str();

	int nLimIndex = 0;
	int nLimLen = strDelims.length();
	int nContentIndex = 0;
	bool bContinue = true;
	while (bContinue)
	{
		nLimIndex = strSource.find(pdelims, nContentIndex);
		if (nLimIndex == -1)
		{
			bContinue = false;
		}
		else
		{
			strDest.push_back(strSource.substr(nContentIndex, nLimIndex - nContentIndex));
			nContentIndex += (nLimIndex - nContentIndex) + nLimLen;
		}
	}
	// 最后一个分隔符 后的内容加入
	strDest.push_back(strSource.substr(nContentIndex));
	return strDest.size();
}

int main()
{
    std::string TestList2 = "123/456//789/100";

	std::vector<std::string> strDest3;
	getSplit(TestList2, strDest3, "/");
    return 0;
}

通过find()函数在查找索引值,对nContentIndex 进行添加达到偏移的效果。再使用substr(),获取对应的子符号,存放在vector中。

输出结果:

方式三:

采用string的成员方法find_first_not_of(),find_first_of()和substr(),达到分割效果

int getSplit(std::string strSource,std::vector<std::string>& strDest, const std::string& strDelims)
{

	int n = 0;	// i 需要的字符索引, j 分隔符所在的索引
	int i = 0;
	int j = 0;

	while (j != std::string::npos)
	{
		i = strSource.find_first_not_of(strDelims.c_str(), j);
		if (i == std::string::npos || strSource.size() < i)
		{
			break;
		}
		j = strSource.find_first_of(strDelims.c_str(), i);
		strDest.push_back(strSource.substr(i, j - i));
		n++;
	}
	return n;
}

int main()
{
    std::string TestList2 = "123/456//789/100";
	std::vector<std::string> strDest3;
	getSplit(TestList2, strDest3, "/");
    return 0;
}

        注意:此方法,原理和方法二类似。在使用此方法时,如果字符串有空字符串不会被统计。

结果:

 和上面两种方式对比,此方法不会存放空字符串。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值