在很多情况要把字符串按指定字符串分割得到分割的字符串数组或者长度。C#时候的split方法都是支持按字符分割的,我每次都是把字符串替换为不可见字符再split的。这次参照M和C#包装dolersplit和dolerl方法。来把字符串分割成向量,和取字符串按特定字符分割的长度。
头文件
#pragma onece
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
void dolerp(string &retStr,string source,string split,int index);
void dolersplit(vector<string> &retvec,string source,string split);
int dolerl(string source,string split);
实现cpp
#include "mutil.h"
void dolerp(string &retStr,string source,string split,int index)
{
retStr="";
if(source=="")
{
return;
}
if(split=="")
{
return;
}
if(index<1)
{
return;
}
int sourceLen=source.length();
if(sourceLen==0)
{
return;
}
int spLen=split.length();
if(spLen==0)
{
return;
}
int curIndex=0;
int startIndex=0;
int endIndex=0;
for(int i=0;i<sourceLen;i++)
{
if(i>=spLen&&source[i]==split[spLen-1])
{
bool isCommon=true;
for(int j=1;j<spLen;j++)
{
if(source[i-j]!=split[spLen-1-j])
{
isCommon=false;
break;
}
}
if(isCommon==true)
{
curIndex++;
if(curIndex==index)
{
endIndex=i-spLen;
break;
}
if(curIndex==index-1)
{
startIndex=i+1;
}
i+=spLen;
}
}
}
if(curIndex==0&&index==1)
{
retStr=source;
return;
}
else if(curIndex<index-1)
{
return;
}
else
{
if(startIndex>endIndex)
{
endIndex=sourceLen-1;
}
int retArrLen=endIndex-startIndex+1;
char retArr[retArrLen];
for(int k=startIndex;k<=endIndex;k++)
{
retStr+=source[k];
}
return;
}
}
int dolerl(string source,string split)
{
int ret=1;
if(source=="")
{
return ret;
}
if(split=="")
{
return ret;
}
int sourceLen=source.length();
if(sourceLen==0)
{
return ret;
}
int spLen=split.length();
if(spLen==0)
{
return ret;
}
int curIndex=0;
int startIndex=0;
int endIndex=0;
for(int i=0;i<sourceLen;i++)
{
if(i>=spLen&&source[i]==split[spLen-1])
{
bool isCommon=true;
for(int j=1;j<spLen;j++)
{
if(source[i-j]!=split[spLen-1-j])
{
isCommon=false;
break;
}
}
if(isCommon==true)
{
ret++;
i+=spLen;
}
}
}
return ret;
}
void dolersplit(vector<string> &retvec,string source,string split)
{
retvec.clear();
if(source=="")
{
return;
}
if(split=="")
{
return;
}
int sourceLen=source.length();
if(sourceLen==0)
{
return;
}
int spLen=split.length();
if(spLen==0)
{
return;
}
int curIndex=0;
int startIndex=0;
int endIndex=0;
for(int i=0;i<sourceLen;i++)
{
if(i>=spLen&&source[i]==split[spLen-1])
{
bool isCommon=true;
for(int j=1;j<spLen;j++)
{
if(source[i-j]!=split[spLen-1-j])
{
isCommon=false;
break;
}
}
if(isCommon==true)
{
int len=i-spLen-startIndex+1;
retvec.push_back(source.substr(startIndex,len));
i+=spLen;
startIndex=i;
}
}
}
if(startIndex<sourceLen)
{
retvec.push_back(source.substr(startIndex,sourceLen-startIndex));
}
}
测试cpp
#include "mutil.h"
int main(int argc, char* argv[])
{
string all="张三^29岁^男^433127199101211234";
string sp="^";
string ret;
cout<<"测试分割取子串*********************"<<endl;
dolerp(ret,all,sp,1);
cout<<"第一位为:"<<ret<<endl;
dolerp(ret,all,sp,2);
cout<<"第二位为:"<<ret<<endl;
dolerp(ret,all,sp,3);
cout<<"第三位为:"<<ret<<endl;
dolerp(ret,all,sp,4);
cout<<"第四位为:"<<ret<<endl;
dolerp(ret,all,"29",2);
cout<<"29分割第二位为:"<<ret<<endl;
dolerp(ret,all,"298",2);
cout<<"298分割第二位为:"<<ret<<endl;
dolerp(ret,all,"433",1);
cout<<"433分割第一位为:"<<ret<<endl;
cout<<"测试分割取子串*********************"<<endl;
cout<<"测试分割向量*********************"<<endl;
vector<string> vecarr;
dolersplit(vecarr,all,sp);
for(int i=0;i<vecarr.size();i++)
{
cout<<"数组第"<<i<<"位为:"<<vecarr[i]<<endl;
}
cout<<"测试分割向量*********************"<<endl;
cout<<"测试分割得到长度*********************"<<endl;
int len=dolerl(all,sp);
cout<<"长度为:"<<len<<endl;
for(int i=1;i<=len;i++)
{
string childStr;
dolerp(childStr,all,sp,i);
cout<<"取第"<<i<<"个字串:"<<childStr<<endl;
}
cout<<"测试分割得到长度*********************"<<endl;
return 0;
}
cmake
cmake_minimum_required (VERSION 3.8)
project ("mutil")
add_executable (mutil "mutil.cpp" "mutil.h" "main.cpp")
编译测试
[zhanglianzhu@zlzlinux mutil]$ cmake /zlz/mutil/CMakeLists.txt
-- Configuring done
-- Generating done
-- Build files have been written to: /zlz/mutil
[zhanglianzhu@zlzlinux mutil]$ make
Consolidate compiler generated dependencies of target mutil
[ 33%] Building CXX object CMakeFiles/mutil.dir/main.cpp.o
[ 66%] Linking CXX executable mutil
[100%] Built target mutil
[zhanglianzhu@zlzlinux mutil]$ ./mutil
测试分割取子串*********************
第一位为:张三
第二位为:29岁
第三位为:男
第四位为:433127199101211234
29分割第二位为:岁^男^433127199101211234
298分割第二位为:
433分割第一位为:张三^29岁^男^
测试分割取子串*********************
测试分割向量*********************
数组第0位为:张三
数组第1位为:29岁
数组第2位为:男
数组第3位为:433127199101211234
测试分割向量*********************
测试分割得到长度*********************
长度为:4
取第1个字串:张三
取第2个字串:29岁
取第3个字串:男
取第4个字串:433127199101211234
测试分割得到长度*********************
[zhanglianzhu@zlzlinux mutil]$
至此包装3个C++字符串操作方法,一个个慢慢包工具方法
|