📄 mystring.cpp
字号:
// MyString.cpp: implementation of the CMyString class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MyString.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMyString::CMyString()
{
}
CMyString::~CMyString()
{
}
/*****************************************************************************
功能:
查找字符串是否含有指定的字符串
参数:
string: 待查找的字符串
strCharSet: 包含的字符串
len: 待查找的字符串长度
返回:
被包含的字符串的起始位置
-1 输入的字符串中不包含指定字符串
*****************************************************************************/
int CMyString::LocateStr(char *Inbuff,char *strCharSet,int len)
{
int i=0;
int j=0;
int ret=-1;
for(;;)
{
for(i=0;i<len;i++)
{
if(Inbuff[j+i]==NULL || strCharSet[i]==NULL)
break;
if(Inbuff[j+i]!=strCharSet[i])
break;
}
if(i==len)
{
ret=j;
break;
}
if(Inbuff[j]==NULL)
break;
j++;
}
return ret;
}
/*****************************************************************************
功能:
查找字符串是否含有指定的字符串
参数:
string 待查找的字符串
strCharSet 包含的字符串
strlen 待查找的字符串长度
setlen 包含的字符串的长度
返回:
被包含的字符串的起始位置,以0为基数
-1 输入的字符串中不包含指定字符串
*****************************************************************************/
int CMyString::LocateStrEx(unsigned char *string,unsigned char *strCharSet,int strlen,int setlen)
{
int i=0,j=0,ret=-1;
for(j=0;j<strlen;j++)
{
for(i=0;i<setlen;i++)
{
if(string[j+i]!=strCharSet[i])
break;
}
if(i==setlen)
{
ret=j;
break;
}
}
return ret;
}
/*****************************************************************************
功能
格式化字符串中的各行,将行尾符都修改为CR(0x0D)/LF(0x0A)
参数
Inbuff 输入字符串
Outbuff 输出字符串
ch 续行符,需要将该字符删除,并将后面的数据与前面的续成一行
如果有两个连续该字符,则认为字符为当前字符
*****************************************************************************/
void CMyString::FormatStrLines(char *Inbuff,char *Outbuff,char ch)
{
if(Inbuff == NULL || strlen(Inbuff) == NULL)
return;
int i=0,j=0,len;
len=strlen(Inbuff);
char *tmp,*tmp2;
tmp=(char *)malloc((len+1)*sizeof(char));
memset(tmp,0,(len+1)*sizeof(char));
tmp2=(char *)malloc((len+1)*sizeof(char));
memset(tmp2,0,(len+1)*sizeof(char));
tmp=Inbuff;
//处理续行符, 该部分处理以后再加
for(;;)
{
if(tmp[i] == 0x00)
break;
if(tmp[i] == ch)
{
if(tmp[i+1] == ch)
{
memcpy(&tmp[i],&tmp[i+1],len-i-1);
len--;
memset(&tmp[len-1],0,sizeof(char));
}
else
{
i++;
// DelchInStr(&tmp[i+1],tmp2,0x20,1);
// memset(&tmp[i],0,strlen(Inbuff)-i);
// DelchInStr(tmp2,&tmp[i],0x09,1);
// len=strlen(tmp);
if(tmp[i] == 0x0D)
{
if(tmp[i+1] == 0x0A)
{
memcpy(&tmp[i],&tmp[i+2],len-i-2);
len=len-2;
}
else
{
memcpy(&tmp[i],&tmp[i+1],len-i-1);
len=len-1;
}
}
}
}
i++;
}
i=0;
for(;;)
{
if(tmp[i] == NULL)
break;
else if(tmp[i] == 0x0D && tmp[i+1] != 0x0A)
{
Outbuff[j++]=0x0D;
Outbuff[j++]=0x0A;
i++;
}
else if(tmp[i] == 0x0A && tmp[i-1] != 0x0D)
{
Outbuff[j++]=0x0D;
Outbuff[j++]=0x0A;
i++;
}
else
{
Outbuff[j++]=tmp[i++];
}
}
}
/*****************************************************************************
功能
删除字符串中的某个字符
参数
Inbuff 待处理的字符串
Outbuff 处理之后的字符串
ch 需要删除的字符
flag 1=在字符串前面删除,遇到非删除字符纪终止
2=在字符串后面删除,遇到非删除字符纪终止
3=在字符串所有位置上都删除
*****************************************************************************/
void CMyString::DelchInStr(char *Inbuff,char *Outbuff,char ch,int flag)
{
if(Inbuff == NULL || strlen(Inbuff) == NULL)
return;
int i=0,j=0;
switch(flag)
{
case 1:
for(;;)
{
if(Inbuff[i] != ch)
break;
i++;
}
sprintf(Outbuff,"%s",&Inbuff[i]);
break;
case 2:
for(;;)
{
if(Inbuff[strlen(Inbuff)-i-1] != ch)
break;
}
memcpy(Outbuff,Inbuff,strlen(Inbuff)-i);
break;
case 3:
for(;;)
{
if(Inbuff[i] == 0x00)
break;
if(Inbuff[i] != ch)
Outbuff[j++]=Inbuff[i++];
else
i++;
}
break;
default:
break;
}
}
/*****************************************************************************
功能
获取字符串中某个位置到指定字符之间的所有字符
参数
Inbuff 待处理的字符串
Outbuff 返回的字符串,返回的字符串不包含指定的字符
pos 指定的位置
ch 指定字符
返回
ch所在的位置,-1 表示查询ch时出现问题,
如果字符串中无ch,则返回的ch=strlen(Inbuff),Outbuff的内容为&Inbuff[pos]后面的所有内容
例如 原串为“12345678”,pos=2,ch=6,获取后的字符串为“345”,则返回值为5.
*****************************************************************************/
int CMyString::GetStrBeforech(char *Inbuff,char *Outbuff,int pos,char ch)
{
if(Inbuff == NULL || strlen(Inbuff) == NULL)
return -1;
sprintf(Outbuff,"%s",&Inbuff[pos]);
char tmp[2];
memset(tmp,0,sizeof(tmp));
sprintf(tmp,"%c",ch);
int n=strcspn(Outbuff,tmp);
if(n < 0)
{
memset(Outbuff,0,strlen(Outbuff));
return -1;
}
memset(&Outbuff[n],0,strlen(Outbuff)-n);
n=n+pos;
return n;
}
/*****************************************************************************
功能
获得字符串中一个匹配字符串,该匹配字符串位于需要匹配的两个字符串之间
参数
Inbuff 待处理的字符串
Outbuff 获得的字符串
begin 匹配起始字符串
end 匹配结束字符串
*****************************************************************************/
void CMyString::GetMatchingStr(char *Inbuff,char *begin,char *end,char *Outbuff)
{
if(Inbuff == NULL || begin == NULL || end == NULL)
return;
int n=0,m=0,i=0,pos1=0,pos2=0;
char *tmp=Inbuff;
m=LocateStr(tmp,begin,strlen(begin));
if(m < 0)
return;
tmp=tmp+m+strlen(begin);
pos1=m+strlen(begin); //匹配得到的字符串的起始位置
pos2=pos1;
i=1;
for(;;)
{
m=LocateStr(tmp,begin,strlen(begin));
n=LocateStr(tmp,end,strlen(end));
if( n < 0)
break;
else if( m > 0)
{
if( m < n)
{
i++;
tmp=tmp+m+strlen(begin);
pos2=pos2+m+strlen(begin);
}
else
{
i--;
tmp=tmp+n+strlen(end);
pos2=pos2+n+strlen(end);
if(i == 0)
{
pos2=pos2-strlen(end);
break;
}
}
}
else //m < 0 && n > 0
{
i--;
tmp=tmp+n+strlen(end);
pos2=pos2+n+strlen(end);
if(i == 0)
{
pos2=pos2-strlen(end);
break;
}
}
}
memcpy(Outbuff,&Inbuff[pos1],pos2-pos1);
}
/*****************************************************************************
功能
获得一个字符串中某个字符间隔出来的段数
参数
Inbuff 待处理的字符串
Interbuff 间隔字符串
Inlen 待处理的字符串的长度
Interlen 间隔字符串的长度
返回
获得的段数
-1 输入的数据为空
0 输入的字符串中不包含间隔字符串
*****************************************************************************/
int CMyString::GetFieldsNumInbuff(unsigned char *Inbuff,unsigned char *Interbuff,int Inlen,int Interlen)
{
if(Inbuff == NULL || Interbuff == NULL)
return -1;
unsigned char *tmp=NULL;
tmp=Inbuff;
int pos=0,i=0,len=Inlen;
for(;;)
{
pos=LocateStrEx(tmp,Interbuff,len,Interlen);
if(pos == -1)
break;
else
{
i++;
len=len-pos-Interlen;
tmp=tmp+pos+Interlen;
}
}
return i;
}
/*****************************************************************************
功能
获得一个字符串中某个字符串间隔,而得到的某段数据
参数
Inbuff 待处理的字符串
Interbuff 间隔字符串
Inlen 待处理的字符串的长度
Interlen 间隔字符串的长度
Segnum 需要获得的第几段,以0为基数。
Outbuff 返回的字符串
返回
获得的段数
-1 输入的数据为空、间隔字符串为空或段数小于零
0 输入的字符串中不包含间隔字符串
举例
Inbuff="00000||11111||22222||33333",Interbuff="||",Inlen=26,Interlen=2
Segnum=2,Outbuff="22222"
*****************************************************************************/
int CMyString::GetFieldInbuff(char *Inbuff,char *Interbuff,int Inlen,int Interlen,int Segnum,char *Outbuff)
{
if(Inbuff == NULL || Interbuff == NULL || Inlen <=0 || Interlen <= 0 ||Segnum < 0)
return -1;
char *tmp=NULL;
tmp=Inbuff;
int pos=0,i=1,len=Inlen;
for(;;)
{
pos=LocateStrEx((unsigned char *)tmp,(unsigned char *)Interbuff,len,Interlen);
if(pos == -1)
{
if(i == Segnum)
{
sprintf(Outbuff,"%s",tmp);
}
break;
}
else
{
if(i == Segnum)
{
memcpy(Outbuff,tmp,pos);
break;
}
else
{
i++;
len=len-pos-Interlen;
tmp=tmp+pos+Interlen;
}
}
}
return i;
}
/*****************************************************************************
功能
清空字符串中某段位置,并把后面的数据前移
参数
Inbuff 待操作的字符串
begin 起始位置,该位置基于0计数
end 结束位置,该位置基于0计数
len 待操作的字符串的长度
example
Input Inbuff="0123456789", begin=1,end=5,len=10,
output Inbuff="056789"
*****************************************************************************/
void CMyString::ClearStrSegment(unsigned char *Inbuff,int begin,int end,int len)
{
//出现下列情况之一,程序退出:
//结束位置小于起始位置;输入字符串长度为空;
//输入字符串长度小于字符串的结束位置;输入字符串的长度小于要清空的长度
if(begin > end || len ==0 || len < end || len < end-begin)
return;
memcpy(&Inbuff[begin],&Inbuff[end],len-end);
memset(&Inbuff[len-end+begin],0x00,end-begin);
}
/*****************************************************************************
功能
定位字符串中某个字符的位置
参数
Inbuff 待操作的字符串
ch 需要定位的字符
len 需要处理的字符串的长度
bPos TRUE 从字符串开始定位,获取字符在字符串中的第一个位置
FALSE 从字符串最后定位,获取字符在字符串中的最后一个位置
返回
定位得到的位置,该位置基于0计数,-1 输入数据有错误,-2 无法查找到指定的字符
*****************************************************************************/
int CMyString::LocateCharInStr(LPCSTR Inbuff,char ch,int len,BOOL bPos)
{
if(Inbuff == NULL || len <= 0)
return -1;
int i=0,step=1;
if( !bPos )
{
i=len-1;
step=-1;
}
for(;;)
{
if(i >= len || i < 0)
break;
if(Inbuff[i] == ch)
break;
i+=step;
}
//没有查找到指定字符
if( i == -1 || i == len)
return -2;
return i;
}
/*****************************************************************************
功能
将十六进制的字符串转化为十进制的字符串
参数
szInbuff 待操作的字符串
nInLen 输入字符串的长度
szOutbuff 转换后的数据
*****************************************************************************/
void CMyString::HexToStr(unsigned char *szInbuff,int nInLen, LPSTR szOutbuff)
{
int i;
char *buff;
i=2*nInLen+1;
buff=(char *)malloc(i*sizeof(char));
memset(buff,0,i*sizeof(char));
for(i=0;i<nInLen;i++)
sprintf(&buff[i*2],"%2.2X",szInbuff[i]);
buff[nInLen*2]=0;
memcpy(szOutbuff,buff,2*nInLen);
delete(buff);
}
/*****************************************************************************
功能
将十进制的字符串转化为十六进制的字符串
参数
szInbuff 待操作的字符串
nInLen 输入字符串的长度
szOutbuff 转换后的数据
*****************************************************************************/
int CMyString::StrToHex(LPCSTR szInbuff,int nInLen,unsigned char *szOutbuff)
{
unsigned char dat;
while (nInLen--)
{
if (AscToHex(*szInbuff++, &dat))
return -1;
*szOutbuff = *szOutbuff << 4 | dat;
if (!(nInLen & 1))
{
++szOutbuff;
}
}
return 0;
}
/*****************************************************************************
功能
将十进制的字符转化为十六进制的字符
参数
szInbuff 待操作的字符
nInLen 输入字符串的长度
szOutbuff 转换后的数据
*****************************************************************************/
int CMyString::AscToHex(char Asc, unsigned char *szHex)
{
if ((Asc >= '0') && (Asc <= '9'))
*szHex = Asc - '0';
else if ((Asc >= 'A') && (Asc <= 'F'))
*szHex = Asc - 'A' + 10;
else if ((Asc >= 'a') && (Asc <= 'f'))
*szHex = Asc - 'a' + 10;
else
return -1;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -