C++ 带中文字符串分割

9 篇文章 0 订阅

 两种方式,一种按分隔符分割,一种按指定长度分割.

按指定长度分割一个汉字长度位2,下面是代码:

// TestStringSplit.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
using namespace std;



/*******************
*作用 :按分隔符分割字符串
*参数:
*std::string str, 要分割的字符串
*std::string pat, 分割符
*bool isRemovePat,是否去掉分隔符
*int patSplitPos=-1  开始查找分隔符的下标
*返回值  分割好的字符串集合
*************************/
std::vector<std::string> split(std::string str, std::string pat,bool isRemovePat=true,int patSplitPos=-1)
{
	printf("分隔符:%s\n",pat.data());
	if(patSplitPos==-1)
	{
		patSplitPos=pat.size();
	}
	std::vector<std::string> bufStr;
	while (true)
	{
		int index = str.find(pat);
		int iSplitPos=0;//分割点
		int iEraserPos=0;//分割点
		if (isRemovePat||index==-1)//如果去掉分割字符串
		{
			iSplitPos=index;
			iEraserPos=index+ pat.size();
		}else
		{
			iSplitPos =index+patSplitPos;
			iEraserPos=index+ patSplitPos;
		}
		std::string subStr = str.substr(0, iSplitPos);
		if (!subStr.empty())
		{
			printf("%s|",subStr.data());
			bufStr.push_back(subStr);
		}
		str.erase(0, iEraserPos);
		if (index == -1)
			break;
	}
	printf("\n");
	return bufStr;
}


/*******************
*作用 :按指定长度分割字符串
*参数:
*string strOld, 要分割的字符串
*int   len  指定分割长度
*返回值  分割好的字符串集合
*************************/
std::vector<std::string> SplitStringWithLenth(std::string strOld,int len)
{
	printf("len=%d \n",len);
	vector<std::string> vtStr;
	vtStr.clear();
	int lenth=strOld.length();
	if(lenth<=len||len<=0)
	{
		vtStr.push_back(strOld);
	}else
	{
		int CharCount=0;
		int start=0;
		int pos=0;
		while(pos<lenth)
		{
    		if (strOld[pos] & 0x80)
			{
				CharCount+=2;
				pos+=2;
			}else
			{
				CharCount+=1;
				pos++;
			}
			if((CharCount>=len)||//长度等于指定长度或比指定长度大1
				(pos==lenth))//长度不足指定长度但已到字符串结尾
			{
				std::string s=strOld.substr(start,CharCount);
				vtStr.push_back(s);
				start=pos;
				CharCount=0;
				printf("%s|",s.data());
			}else
			{
				continue;
			}
		}
	}
	printf("\n");
	return vtStr;

}

int _tmain(int argc, _TCHAR* argv[])
{
	//string str="{\"KEY\"}";
	//std::vector<std::string> plits = split(str, "}{\"",false,1);
	//for (int i = 0; i < plits.size(); i++)
	//{
	//	printf(" %s", plits.at(i).c_str());
	//}
	//printf("\n原:%sn",str.c_str());
	//printf("size()= %d  length()= %d\n",str.size(),str.length());
	//printf("str[str.size()]=%X  str[str.length()]=%X  str[str.length()-1]=%C\n",str[str.size()],str[str.length()],str[str.length()-1]);
	/*string str1="喊";
	printf("%s   :size=%d    length=%d   strlen.data()=%d   strlen.c_str()=%d\n",str1.data(),str1.size(),str1.length(),strlen(str1.data()),strlen(str1.c_str()));
	str1="1";
	printf("%s   :size=%d    length=%d   strlen.data()=%d   strlen.c_str()=%d\n",str1.data(),str1.size(),str1.length(),strlen(str1.data()),strlen(str1.c_str()));
	str1="1安";
	printf("%s   :size=%d    length=%d   strlen.data()=%d   strlen.c_str()=%d\n",str1.data(),str1.size(),str1.length(),strlen(str1.data()),strlen(str1.c_str()));
	str1="\r\n";
	printf("%s   :size=%d    length=%d   strlen.data()=%d   strlen.c_str()=%d\n",str1.data(),str1.size(),str1.length(),strlen(str1.data()),strlen(str1.c_str()));*/


	std::string str="莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。";
	split(str,",");
	split(str,",",false);
	split(str,"打叶声,",false);
	split(str,"雨",false);
	split(str,"。");
	int  n=1;
	SplitStringWithLenth(str,n++);
	SplitStringWithLenth(str,n++);
	SplitStringWithLenth(str,n++);
	SplitStringWithLenth(str,n++);
	SplitStringWithLenth(str,n++);
	SplitStringWithLenth(str,n++);
	SplitStringWithLenth(str,n++);
	SplitStringWithLenth(str,n++);
	
	system("pause");
	return 0;
}

结果:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,可以使用一些方法来实现中英文字符串分割。以下是一种常见的方法: 1. 使用标准库函数: 可以使用C++标准库中的字符串处理函数来实现字符串分割,例如使用`std::string`的`find`和`substr`函数。 示例代码如下: ```cpp #include <iostream> #include <string> int main() { std::string str = "Hello, 你好"; std::string delimiter = ", "; size_t pos = 0; std::string token; while ((pos = str.find(delimiter)) != std::string::npos) { token = str.substr(0, pos); std::cout << token << std::endl; str.erase(0, pos + delimiter.length()); } std::cout << str << std::endl; return 0; } ``` 运行结果: ``` Hello 你好 ``` 这个示例代码中,我们使用了`find`函数来查找分隔符的位置,然后使用`substr`函数来提取子字符串。通过循环不断提取子字符串,直到没有分隔符为止。 2. 使用第三方库: 除了使用标准库函数,还可以使用一些第三方库来实现字符串分割,例如Boost库中的`split`函数。 示例代码如下: ```cpp #include <iostream> #include <string> #include <boost/algorithm/string.hpp> int main() { std::string str = "Hello, 你好"; std::vector<std::string> tokens; boost::split(tokens, str, boost::is_any_of(", ")); for (const auto& token : tokens) { std::cout << token << std::endl; } return 0; } ``` 运行结果: ``` Hello 你好 ``` 这个示例代码中,我们使用了Boost库中的`split`函数来实现字符串分割。该函数将字符串按照指定的分隔符进行分割,并将结果存储在一个`std::vector`容器中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值