两种方式,一种按分隔符分割,一种按指定长度分割.
按指定长度分割一个汉字长度位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;
}
结果: