📄 kstring.cpp
字号:
// KString.cpp: implementation of the KString class.
//
//////////////////////////////////////////////////////////////////////
#include "..\stdafx.h"
#include "KString.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
KString::KString()
{
m_nLength=0;
m_pData=NULL;
}
KString::KString(LPCTSTR sz)
{
m_nLength=0;
m_pData=NULL;
strncpy(sz,strlen(sz));
}
KString::KString(const KString& str)
{
m_nLength=0;
m_pData=NULL;
strncpy(str.m_pData,str.m_nLength);
}
KString::~KString()
{
if(m_pData)HeapFree(m_pData);
}
void KString::AllocBuffer(int nLen, BOOL bCopy)
{
nLen=nLen+1;
if(m_pData)
{
if(HeapAllocSize(m_pData)<nLen)
{
LPTSTR s=m_pData;
HeapFree(s);
m_pData=(LPTSTR)HeapAlloc(nLen);
if(bCopy)CopyMemory(m_pData,s,m_nLength);
}
}
else m_pData=(LPTSTR)HeapAlloc(nLen);
}
void KString::FreeExtra()
{
if(m_pData)
{
LPTSTR s=m_pData;
HeapFree(s);
m_pData=(LPTSTR)HeapAlloc(m_nLength+1);
CopyMemory(m_pData,s,m_nLength);
}
}
int KString::strlen(LPCTSTR sz)
{
if(sz)
{
LPTSTR s=(LPTSTR)sz;
while(*s)s++;
return s-sz;
}
else return 0;
}
void KString::strncpy(LPCTSTR sz,int nCount)
{
AllocBuffer(nCount,FALSE);
CopyMemory(m_pData,sz,nCount);
m_pData[nCount]=0;
m_nLength=nCount;
}
void KString::strncat(LPCTSTR sz, int nCount)
{
int nSize2=m_nLength+nCount;
AllocBuffer(nSize2,TRUE);
CopyMemory(m_pData+m_nLength,sz,nCount);
m_nLength+=nCount;
m_pData[m_nLength]=0;
}
int KString::Compare(LPCTSTR sz,int nCount)
{
TCHAR c1,c2;
int r=0;
LPTSTR s1=m_pData;
LPTSTR s2=(LPTSTR)sz;
if(nCount>0)
{
do
{
c1=*s1++;c2=*s2++;
if(c1>c2){r=1;break;}
if(c1<c2){r=-1;break;}
}while(--nCount && c1 && c2);
}
else if(nCount<0)
{
nCount=-nCount;
do
{
c1=*s1++;c2=*s2++;
c1=c1>='a' && c1<='z'?c1-32:c1;
c2=c2>='a' && c1<='z'?c2-32:c2;
if(c1>c2){r=1;break;}
if(c1<c2){r=-1;break;}
}while(--nCount && c1 && c2);
}
else r=0;
return r;
}
KString KString::Left(int nCount)
{
KString str;
nCount=min(m_nLength,nCount);
str.strncpy(m_pData,nCount);
return str;
}
KString KString::Right(int nCount)
{
KString str;
nCount=min(m_nLength,nCount);
str.strncpy(m_pData+m_nLength-nCount,nCount);
return str;
}
KString KString::Mid(int nFirst, int nCount)
{
KString str;
if(nCount<0)nCount=m_nLength-nFirst;
else nCount=min(m_nLength-nFirst,nCount);
str.strncpy(m_pData+nFirst,nCount);
return str;
}
int KString::Find(LPCTSTR sz,int nStart)
{
LPTSTR s1,s2,str=m_pData+nStart;
while(*str)
{
s1=str;s2=(LPTSTR)sz;
while(*s1 && *s2 && *s1==*s2)
{
s1++;s2++;
}
if(!(*s2))return str-m_pData;
str++;
}
return -1;
}
int KString::Find(TCHAR ch,int nStart)
{
LPTSTR s=m_pData+nStart;
while(*s)
{
if(*s==ch)return s-m_pData;
s++;
}
return -1;
}
int KString::ReverseFind(TCHAR ch)
{
LPTSTR s=m_pData+m_nLength;
while(*(--s))
{
if(*s==ch)return s-m_pData;
}
return -1;
}
int KString::FindOneOf(LPCTSTR szCharSet)
{
TCHAR c;
LPTSTR s2,str=m_pData;
while(*str)
{
c=*str++;
s2=(LPTSTR)szCharSet;
while(*s2)
{
if(*s2==c)return str-m_pData-1;
s2++;
}
}
return -1;
}
void KString::MakeUpper()
{
LPTSTR s=m_pData;
while(*s)
{
if(*s>='a' && *s<='z')*s-=32;
s++;
}
}
void KString::MakeLower()
{
LPTSTR s=m_pData;
while(*s)
{
if(*s>='A' && *s<='Z')*s+=32;
s++;
}
}
#define SF_START 0x010000
#define SF_LEFT 0x020000
#define SF_PSIGN 0x040000
#define SF_PREC 0x080000
#define SF_PRECMASK 0x000f00
#define SF_WIDTHMASK 0x00f000
#define SF_PRECSHIFT 8
#define SF_WIDTHSHIFT 12
void KString::Format(LPCTSTR szFormat, ...)
{
int i,nCnt,nStyle=0;
TCHAR c;
LPTSTR str,szFmt,aBuf,p,p2;
int* pVar;
szFmt=(LPTSTR)szFormat;
pVar=(int*)(&szFormat+1);
aBuf=(LPTSTR)HeapAlloc(1024);
p=aBuf;
p2=aBuf+1000;
while(*szFmt)
{
c=*szFmt++;
if(nStyle & SF_START)
{
switch(c)
{
case 'c': //字符
case 'C':
*p++=(TCHAR)(*pVar++);
nStyle &= ~ SF_START;
break;
case 'd': //小数
case 'i': //小数
case 'u': //无符号
case 'o': //八进制
case 'x': //16进制小写
case 'X': //16进制大写
if(c=='x' || c=='o')nCnt=fmtHex(p2,*pVar++,FALSE);
else if(c=='X')nCnt=fmtHex(p2,*pVar++,TRUE);
else nCnt=fmtInt(p2,*pVar++,(nStyle & SF_PSIGN)?2:1);
if(nStyle & SF_LEFT)for(i=0;i<nCnt;i++)*p++=p2[i];
i=(nStyle & SF_WIDTHMASK)>>SF_WIDTHSHIFT;
c=(TCHAR)nStyle;c=c?c:' ';
for(;i>nCnt;i--)*p++=c;
if(!(nStyle & SF_LEFT))for(i=0;i<nCnt;i++)*p++=p2[i];
nStyle &= ~ SF_START;
break;
case 'e': //指数格式
case 'E': //指数格式
case 'f': //浮点格式
case 'g': //常用格式
case 'G': //常用标准格式
if(c=='g' || c=='G')
{
i=(nStyle & SF_WIDTHMASK)>>SF_WIDTHSHIFT;
i=i>0?-i:-6;
}
else
{
i=(nStyle & SF_PRECMASK)>>SF_PRECSHIFT;
i=i>0?i:4;
}
nCnt=fmtDouble(p2,*(double*)pVar++,
i,(nStyle & SF_PSIGN)?2:1);
pVar++;
if(nStyle & SF_LEFT)for(i=0;i<nCnt;i++)*p++=p2[i];
i=(nStyle & SF_WIDTHMASK)>>SF_WIDTHSHIFT;
if(c=='g' || c=='G')i=0;
c=(TCHAR)nStyle;c=c?c:' ';
for(;i>nCnt;i--)*p++=c;
if(!(nStyle & SF_LEFT))for(i=0;i<nCnt;i++)*p++=p2[i];
nStyle &= ~ SF_START;
break;
case 'n': //地址
case 'p': //地址
nStyle &= ~ SF_START;
break;
case 's':
case 'S':
str=(LPTSTR)(*pVar++);
while(*str)*p++=*str++;
nStyle &= ~ SF_START;
break;
case '-': //数字左齐
nStyle|= SF_LEFT;
break;
case '+': //启用+-符号
nStyle |= SF_PSIGN;
break;
case '.': //后面的数字是小数位宽度
nStyle |= SF_PREC;
break;
case '%': //%的替用符号
*p++=c;
nStyle &= ~ SF_START;
break;
break;
case '0': //数字右齐时左边空白填0
case '#': //数字右齐时左边空白填#
case '$': //数字右齐时左边空白填$
if(!(nStyle & 0xff))
{
nStyle &=~0xff;nStyle|=c;
break;
}
default:
if(c>='0' && c<='9')
{
if(!(nStyle & 0xff))nStyle &=~0xff;nStyle|=' ';
if(nStyle & SF_PREC)//小数位精度
{
i=(nStyle & SF_PRECMASK)>>SF_PRECSHIFT;
i=i*10+(c-'0');
nStyle &=~SF_PRECMASK;
nStyle |=i<<SF_PRECSHIFT;
}
else //总宽度
{
i=(nStyle & SF_WIDTHMASK)>>SF_WIDTHSHIFT;
i=i*10+(c-'0');
nStyle &=~SF_WIDTHMASK;
nStyle |=i<<SF_WIDTHSHIFT;
}
}
}
}
else if(c=='%')nStyle=SF_START;
else *p++=c;
}
strncpy(aBuf,p-aBuf);
HeapFree(aBuf);
}
int KString::toInt()
{
TCHAR c;
LPTSTR s=m_pData;
int nSign=0;
int nValue=0;
while(*s)
{
c=*s++;
if(c>='0' && c<='9')
{
nValue*=10;nValue+=c-'0';
}
else if(c=='-')
{
if(nSign)break;
else {nSign=-1;continue;}
}
else if(c=='+')
{
if(nSign)break;
else {nSign=1;continue;}
}
else break;
}
return nSign<0?-nValue:nValue;
}
int KString::toHex()
{
TCHAR c;
int nSign=1;
int nBase,nValue=0;
LPTSTR s=m_pData;
while(*s)
{
c=*s++;
if(c>='0' && c<='9')nBase=c-48;
else if(c>='a' && c<='f')nBase=c-87;
else if(c>='A' && c<='F')nBase=c-55;
else if(c=='-'){nSign=-1;continue;}
else continue;
nValue<<=4;nValue+=nBase;
}
return nSign<0?-nValue:nValue;
}
double KString::toDouble()
{
TCHAR c;
LPTSTR s=m_pData;
int nSign=0;
int nFloat=0;
double dValue=0;
while(*s)
{
c=*s++;
if(c>='0' && c<='9')
{
dValue*=10;dValue+=c-'0';
if(nFloat)nFloat*=10;
}
else if(c=='.')
{
if(nFloat)break;
else
{
nFloat=1;
if(!nSign)nSign=1;
continue;
}
}
else if(c=='-')
{
if(nSign)break;
else {nSign=-1;continue;}
}
else if(c=='+')
{
if(nSign)break;
else {nSign=1;continue;}
}
else break;
}
dValue=nFloat>0?dValue/nFloat:dValue;
return nSign<0?-dValue:dValue;
}
int KString::fmtInt(TCHAR aBuf[], int nValue,int nSign)
{
TCHAR nBase;
int j,i=0;
int nVal=nValue;
if(nValue)
{
nVal=(nVal<0)?-nVal:nVal;
do
{
nBase=(TCHAR)(nVal%10);
aBuf[i]=nBase+48;
nVal/=10;
i++;
}while(nVal);
if(nValue>0 && nSign>1){aBuf[i++]='+';}
if(nValue<0 && nSign>0){aBuf[i++]='-';}
for(j=(i-1)/2;j>=0;j--){nBase=aBuf[j];aBuf[j]=aBuf[i-j-1];aBuf[i-j-1]=nBase;}
}
else
{
aBuf[i++]='0';
}
return i;
}
int KString::fmtHex(TCHAR aBuf[], int nValue,BOOL bUpper)
{
TCHAR nBase;
int j,i=0;
UINT nVal=(UINT)nValue;
if(nValue)
{
do
{
nBase=(TCHAR)(nVal & 0xf);
if(nBase<10)aBuf[i]=nBase+48;
else if(bUpper)aBuf[i]=nBase+55;
else aBuf[i]=nBase+87;
nVal>>=4;
i++;
}while(nVal);
for(j=(i-1)/2;j>=0;j--){nBase=aBuf[j];aBuf[j]=aBuf[i-j-1];aBuf[i-j-1]=nBase;}
}
else
{
aBuf[i++]='0';
}
return i;
}
int KString::fmtDouble(TCHAR aBuf[], double dValue,int nPrec,int nSign)
{
TCHAR nBase;
int k,j,i=0;
if(dValue>0){if(nSign>1)aBuf[i++]='+';}
else if(dValue<0)
{
dValue=-dValue;
if(nSign>0)aBuf[i++]='-';
}
j=(int)(nPrec?dValue:dValue+0.5);
dValue-=j;
i+=fmtInt(aBuf+i,j,0);
j=(nPrec<0)?-nPrec-i-1:nPrec;
if(j>0 && (nPrec>0 || dValue>0))
{
k=2;
for(nBase=0;nBase<j;nBase++)k*=10;
dValue+=1.0/k;
aBuf[i++]='.';
do
{
dValue*=10;
nBase=(TCHAR)dValue;
dValue-=nBase;
if(dValue>0.9999999999){dValue=0;nBase+=1;}
aBuf[i]=nBase+48;
i++;
if(nPrec<0 && dValue==0)break;
}while(--j);
}
return i;
}
int KString::Replace(LPCTSTR szOld, LPCTSTR szNew)
{
int nAT,nAT0=0;
int i,nCount=0;
int nOldLen=strlen(szOld);
int nNewLen=strlen(szNew);
LPTSTR s,str;
s=str=(LPTSTR)HeapAlloc(1024);
while((nAT=Find(szOld,nAT0))!=-1)
{
nCount++;
for(i=nAT0;i<nAT;i++)
{
*s++=m_pData[i];
}
nAT0=nAT+nOldLen;
for(i=0;i<nNewLen;i++)
{
*s++=szNew[i];
}
}
for(i=nAT0;i<m_nLength;i++)
{
*s++=m_pData[i];
}
strncpy(str,s-str);
HeapFree(str);
return nCount;
}
void KString::TrimRight(LPCTSTR szTarget)
{
TCHAR c;
LPTSTR s2,str=m_pData+m_nLength;
while(str>m_pData)
{
c=*(--str);
s2=(LPTSTR)szTarget;
while(*s2 && *s2!=c)
{
s2++;
}
if(!*s2)
{
*(++str)=0;
m_nLength=str-m_pData;
break;
}
}
}
void KString::TrimLeft(LPCTSTR szTarget)
{
LPTSTR s2,str=m_pData;
while(*str)
{
s2=(LPTSTR)szTarget;
while(*s2 && *s2!=*str)
{
s2++;
}
if(!*s2)
{
s2=m_pData;
do
{
*s2++=*str++;
}while(*str);
*s2=0;
m_nLength=s2-m_pData;
break;
}
str++;
}
}
LPTSTR KString::GetBuffer(int nMinBufLength)
{
AllocBuffer(nMinBufLength,TRUE);
return m_pData;
}
void KString::ReleaseBuffer(int nNewLength)
{
if(nNewLength>-1)
{
m_nLength=nNewLength;
m_pData[m_nLength]=0;
}
else
{
m_nLength=strlen(m_pData);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -