?? mystring.cpp
字號(hào):
// 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()
{
}
/*****************************************************************************
功能:
查找字符串是否含有指定的字符串
參數(shù):
string: 待查找的字符串
strCharSet: 包含的字符串
len: 待查找的字符串長(zhǎng)度
返回:
被包含的字符串的起始位置
-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;
}
/*****************************************************************************
功能:
查找字符串是否含有指定的字符串
參數(shù):
string 待查找的字符串
strCharSet 包含的字符串
strlen 待查找的字符串長(zhǎng)度
setlen 包含的字符串的長(zhǎng)度
返回:
被包含的字符串的起始位置,以0為基數(shù)
-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)
參數(shù)
Inbuff 輸入字符串
Outbuff 輸出字符串
ch 續(xù)行符,需要將該字符刪除,并將后面的數(shù)據(jù)與前面的續(xù)成一行
如果有兩個(gè)連續(xù)該字符,則認(rèn)為字符為當(dāng)前字符
*****************************************************************************/
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;
//處理續(xù)行符, 該部分處理以后再加
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++];
}
}
}
/*****************************************************************************
功能
刪除字符串中的某個(gè)字符
參數(shù)
Inbuff 待處理的字符串
Outbuff 處理之后的字符串
ch 需要?jiǎng)h除的字符
flag 1=在字符串前面刪除,遇到非刪除字符紀(jì)終止
2=在字符串后面刪除,遇到非刪除字符紀(jì)終止
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;
}
}
/*****************************************************************************
功能
獲取字符串中某個(gè)位置到指定字符之間的所有字符
參數(shù)
Inbuff 待處理的字符串
Outbuff 返回的字符串,返回的字符串不包含指定的字符
pos 指定的位置
ch 指定字符
返回
ch所在的位置,-1 表示查詢ch時(shí)出現(xiàn)問題,
如果字符串中無ch,則返回的ch=strlen(Inbuff),Outbuff的內(nèi)容為&Inbuff[pos]后面的所有內(nèi)容
例如 原串為“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;
}
/*****************************************************************************
功能
獲得字符串中一個(gè)匹配字符串,該匹配字符串位于需要匹配的兩個(gè)字符串之間
參數(shù)
Inbuff 待處理的字符串
Outbuff 獲得的字符串
begin 匹配起始字符串
end 匹配結(jié)束字符串
*****************************************************************************/
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);
}
/*****************************************************************************
功能
獲得一個(gè)字符串中某個(gè)字符間隔出來的段數(shù)
參數(shù)
Inbuff 待處理的字符串
Interbuff 間隔字符串
Inlen 待處理的字符串的長(zhǎng)度
Interlen 間隔字符串的長(zhǎng)度
返回
獲得的段數(shù)
-1 輸入的數(shù)據(jù)為空
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;
}
/*****************************************************************************
功能
獲得一個(gè)字符串中某個(gè)字符串間隔,而得到的某段數(shù)據(jù)
參數(shù)
Inbuff 待處理的字符串
Interbuff 間隔字符串
Inlen 待處理的字符串的長(zhǎng)度
Interlen 間隔字符串的長(zhǎng)度
Segnum 需要獲得的第幾段,以0為基數(shù)。
Outbuff 返回的字符串
返回
獲得的段數(shù)
-1 輸入的數(shù)據(jù)為空、間隔字符串為空或段數(shù)小于零
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;
}
/*****************************************************************************
功能
清空字符串中某段位置,并把后面的數(shù)據(jù)前移
參數(shù)
Inbuff 待操作的字符串
begin 起始位置,該位置基于0計(jì)數(shù)
end 結(jié)束位置,該位置基于0計(jì)數(shù)
len 待操作的字符串的長(zhǎng)度
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)
{
//出現(xiàn)下列情況之一,程序退出:
//結(jié)束位置小于起始位置;輸入字符串長(zhǎng)度為空;
//輸入字符串長(zhǎng)度小于字符串的結(jié)束位置;輸入字符串的長(zhǎng)度小于要清空的長(zhǎng)度
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);
}
/*****************************************************************************
功能
定位字符串中某個(gè)字符的位置
參數(shù)
Inbuff 待操作的字符串
ch 需要定位的字符
len 需要處理的字符串的長(zhǎng)度
bPos TRUE 從字符串開始定位,獲取字符在字符串中的第一個(gè)位置
FALSE 從字符串最后定位,獲取字符在字符串中的最后一個(gè)位置
返回
定位得到的位置,該位置基于0計(jì)數(shù),-1 輸入數(shù)據(jù)有錯(cuò)誤,-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;
}
/*****************************************************************************
功能
將十六進(jìn)制的字符串轉(zhuǎn)化為十進(jìn)制的字符串
參數(shù)
szInbuff 待操作的字符串
nInLen 輸入字符串的長(zhǎng)度
szOutbuff 轉(zhuǎn)換后的數(shù)據(jù)
*****************************************************************************/
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);
}
/*****************************************************************************
功能
將十進(jìn)制的字符串轉(zhuǎn)化為十六進(jìn)制的字符串
參數(shù)
szInbuff 待操作的字符串
nInLen 輸入字符串的長(zhǎng)度
szOutbuff 轉(zhuǎn)換后的數(shù)據(jù)
*****************************************************************************/
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;
}
/*****************************************************************************
功能
將十進(jìn)制的字符轉(zhuǎn)化為十六進(jìn)制的字符
參數(shù)
szInbuff 待操作的字符
nInLen 輸入字符串的長(zhǎng)度
szOutbuff 轉(zhuǎn)換后的數(shù)據(jù)
*****************************************************************************/
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -