⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mystring.cpp

📁 字符串操作程序,包含字符串合并,删除等操作
💻 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 + -