主题:以前写的一个String类
//
// string.cpp TString类的具体实现
///////////////////////////////////////////////
#include"tstring.h"
///////////////////////////////////////////////
//构造函数
TString::TString(long far mLen) //仅定义长度
{
m_lLen=0; //串中元素总数置零
m_lSize=mLen+1;
m_pRoom=new char[m_lSize];
assert(m_pRoom);
for(long i=0;i<m_lSize;i++)
m_pRoom[i]='\0';
}
TString::TString(const char far ch) //字符到类
{
m_lLen=1;
m_lSize=2;
m_pRoom=new char[m_lSize];
assert(m_pRoom);
m_pRoom[0]=ch;
m_pRoom[1]='\0';
}
TString::TString(const char far* pch)//字符串到类
{
m_lLen=strlen(pch);
m_lSize=m_lLen+1;
m_pRoom=new char[m_lSize];
assert(m_pRoom);
strcpy(m_pRoom,pch);
m_pRoom[m_lLen]='\0';
}
///////////////////////////////////////////////
//拷贝构造函数
TString::TString(const TString far& s)
{
m_lLen=s.m_lLen;
m_lSize=s.m_lSize;
m_pRoom=new char[m_lSize];
assert(m_pRoom);
strcpy(m_pRoom,s.m_pRoom);
m_pRoom[m_lLen]='\0';
}
///////////////////////////////////////////////
//析构函数
TString::~TString()
{
delete[] m_pRoom; //无须判空
}
///////////////////////////////////////////////
//返回s中下标为idx的字符
char far TString::StrChar(long far idx)
{
return m_pRoom[idx];
}
///////////////////////////////////////////////
//比较两个TString前n个字符大小
//mode(比较/匹配模式):1:大小写敏感;-1:大小写不敏感
int far TString::StrCompare(const TString far & s1,long far n,int far mode)
{
// if(n<1)n=1;///////////////error
mode= mode>0?1:-1;
switch(mode)
{
case 1:
return memcmp(m_pRoom,s1.m_pRoom,n); //调用string.h中函数实现
case -1:
return memicmp(m_pRoom,s1.m_pRoom,n); //同上
default:
return 1;
}
}
///////////////////////////////////////////////
//长度函数
long far TString::StrLen()
{
return m_lLen;
}
///////////////////////////////////////////////
//连接函数
TString far& TString::StrConcat(const TString far& s1)
{
m_lLen+=s1.m_lLen;
m_lSize=m_lLen+1;
char * reTemp=new char[m_lSize];
assert(reTemp);
if(m_pRoom[0]!='\0')
strcpy(reTemp,m_pRoom);
else
reTemp[0]='\0';
strcat(reTemp,s1.m_pRoom);
delete[] m_pRoom;
m_pRoom=reTemp;
return *this;
}
///////////////////////////////////////////////
//字符位置函数
long far TString::StrCharAt(char far ch,int far mode,long far sn)
{
assert(sn>0);
long times=0,i=0;
for(i=0;i<m_lLen;i++)
if(twoCharCmp(m_pRoom[i],ch,mode)==0&&(++times==sn))
return i;
return -1; //查找失败
}
///////////////////////////////////////////////
//求子串函数,num不可以为负
//num不能出越界,不影响母串
TString far& TString::StrSub(long far sn,long far num)
{
if(sn<1) sn=1;
long currNew=0;
TString* TStringNew;
long sta=sn-1; //设定起点
if(num==0) //复制整个串
{
TStringNew=new TString(m_lLen-sn+1);
while(m_pRoom[sta])
TStringNew->m_pRoom[currNew++]=m_pRoom[sta++];
TStringNew->m_pRoom[currNew]='\0';
TStringNew->m_lLen=m_lLen-sn+1;
}
else
{
TStringNew=new TString(num);
while(currNew<(TStringNew->m_lSize-1))
TStringNew->m_pRoom[currNew++]=m_pRoom[sta++];
TStringNew->m_pRoom[currNew]='\0';
TStringNew->m_lLen=num;
}
return *TStringNew;
}
///////////////////////////////////////////////
//插入函数
TString far& TString::StrInsert(TString far & s1,long far sn)
{
assert(sn);
sn=sn>m_lLen?m_lLen+1:sn; //右越界处理
sn=sn-1;
if(m_lSize<m_lLen+s1.m_lLen+1)
{
m_lSize+=s1.m_lLen;
char* charNew=new char[m_lSize];
long curr=0,curr2=0;
while(curr<sn)
charNew[curr]=m_pRoom[curr++]; //前
while(curr<sn+s1.m_lLen)
charNew[curr++]=s1.m_pRoom[curr2++];//插入
curr2=sn;
while(curr<m_lLen+s1.m_lLen)
charNew[curr++]=m_pRoom[curr2++]; //后
charNew[curr++]='\0'; //置空
delete[] m_pRoom;
m_pRoom=charNew;
}
else
{
long curr=m_lLen-1,curr2=0;
m_pRoom[m_lLen+s1.m_lLen]='\0';
while(curr>=sn)
m_pRoom[curr+s1.m_lLen]=m_pRoom[curr--];//后移
curr=sn;
while(curr<sn+s1.m_lLen)
m_pRoom[curr++]=s1.m_pRoom[curr2++]; //插入
}
m_lLen+=s1.m_lLen;
return *this;
}
///////////////////////////////////////////////
//删除函数
TString far & TString::StrDelete(long far sn,long far num)
{
sn=sn-1;
long currP=sn; //删除子串的首下标
long currB=sn+num; //删除子串后原串首下标
currB= currB<m_lLen?currB:m_lLen;
while(m_pRoom[currB])
m_pRoom[currP++]=m_pRoom[currB++];//移位
while(m_pRoom[currP]) //置零
{
m_pRoom[currP++]='\0';
m_lLen--;
}
return *this;
}
///////////////////////////////////////////////
//删除s中打头空格,返回s
TString far & TString::StrTrimL()
{
long idx=0;
while(m_pRoom[idx]==' ')
idx++;
StrDelete(1,idx);
return *this;
}
///////////////////////////////////////////////
//删除s中尾随空格,返回s
TString far & TString::StrTrimR()
{
long idx=m_lLen-1;
long num=0;
while(m_pRoom[idx]==' ')
{
idx--;
num++;
}
StrDelete(idx,num);
return *this;
}
///////////////////////////////////////////////
//删除s中打头和尾随空格,返回s
TString far & TString::StrTrimLR()
{
StrTrimL();
StrTrimR();
return *this;
}
///////////////////////////////////////////////
//删除s中所有空格,返回s
TString far & TString::StrTrimAll()
{
long idx=0;
while(idx<m_lLen)
if(m_pRoom[idx]==' ')
StrDelete(idx+1,1);
else
idx++;
return *this;
}
///////////////////////////////////////////////
//逆置串
TString far& TString::StrBackspin()
{
return backspin(*this);
}
///////////////////////////////////////////////
//转化为大写
TString far& TString::ToUpper()
{
int i=0;
while(m_pRoom[i])
{
if(isLowerCase(m_pRoom[i]))
m_pRoom[i]=(m_pRoom[i]-'a')+'A';
i++;
}
return *this;
}
///////////////////////////////////////////////
//转化为小写
TString far& TString::ToLower()
{
int i=0;
while(m_pRoom[i])
{
if(!isLowerCase(m_pRoom[i]))
m_pRoom[i]=(m_pRoom[i]-'A')+'a';
i++;
}
return *this;
}
///////////////////////////////////////////////
//转化为整数,也可用stdlib.h中的atoi(char*)实现
long far TString::ToInteger()
{
return atoi(m_pRoom);
}
///////////////////////////////////////////////
//转化为浮点数
double far TString::ToFloat()
{
return atof(m_pRoom);
}
///////////////////////////////////////////////
//将number所表示的数值转化为字符串,作为s的新值
TString far& TString::ToString(double far number,int wd)
{
if(m_pRoom)
delete[] m_pRoom;
m_lSize=wd+6;
m_pRoom=new char[m_lSize];
gcvt(number,wd,m_pRoom);
m_lLen=strlen(m_pRoom);
return *this;
}
///////////////////////////////////////////////
//取子串
TString far& TString::operator ()(long far pos,long far len)
{
return StrSub(pos,len);
}
///////////////////////////////////////////////
//相等比较
int far TString::operator ==(const TString far& ob)
{
long length=ob.m_lLen>m_lLen?m_lLen:ob.m_lLen;
if(StrCompare(ob,length)==0&&ob.m_lLen==m_lLen)
return 1;
else
return 0;
}
///////////////////////////////////////////////
//不等比较
int far TString::operator !=(const TString far& ob)
{
long length=ob.m_lLen>m_lLen?m_lLen:ob.m_lLen;
if(StrCompare(ob,length)==0&&ob.m_lLen==m_lLen)
return 0;
else
return 1;
}
int far TString::operator >(const TString far& ob)
{
long length=ob.m_lLen<m_lLen?m_lLen:ob.m_lLen;
if(StrCompare(ob,length)>0)
return 1;
else
return 0;
}
int far TString::operator <(const TString far& ob)
{
long length=ob.m_lLen<m_lLen?m_lLen:ob.m_lLen;
if(StrCompare(ob,length)<0)
return 1;
else
return 0;
}
///////////////////////////////////////////////
//求非
int far TString::operator !()const
{
return m_lLen!=0;
}
///////////////////////////////////////////////
//赋值
TString far& TString::operator =(const TString far& ob)
{
StrDelete();
return StrConcat(ob);
}
///////////////////////////////////////////////
//连接
TString far& TString::operator +=(const TString far& ob)
{
return StrConcat(ob);
}
///////////////////////////////////////////////
//取字符
char far TString::operator [](int far idx)
{
return StrChar(idx);
}
//////////////////////////////////////////////
//转化成普通字符串
TString::operator const char far*()
{
return m_pRoom;
}
/////////////////////////////////////////////
//输入
istream & operator >>(istream& in,TString far& str)
{
str.StrDelete();
char c=getche();
while(c!='\r')
{
str+=TString(c);
c=getche();
}
cout<<endl;
return in;
}
/////////////////////////////////////////////
//输出
ostream & operator <<(ostream & out,TString far & str)
{
long i=0;
while(str.m_pRoom[i])
out<<str.m_pRoom[i++];
return out;
}
///////////////////////////////////////////////
//判断大小写,s必须为字母
int far TString::isLowerCase(char far s)
{
return ((s>='a')&&(s<='z'));
}
///////////////////////////////////////////////
//带mode比较两字符
int far TString::twoCharCmp(char far s,char far d,int far mode)
{
mode=mode>=0?1:-1;
switch(mode)
{
case 1:
return (s-d);
case -1:
s=s|0xdf;
d=d|0xdf;
return (s-d);
}
return 1;
}
///////////////////////////////////////////////
//逆置串,改变ops并返回
TString far & TString::backspin(TString far & ops)
{
long len=ops.m_lLen-1;
int flag=len%2==0?0:1;
long i=0;
char temp='\0';
while((len-i)!=flag)
{
temp=ops.m_pRoom[len];
ops.m_pRoom[len]=ops.m_pRoom[i];
ops.m_pRoom[i]=temp;
i++;
len--;
}
temp=ops.m_pRoom[len];
ops.m_pRoom[len]=ops.m_pRoom[i];
ops.m_pRoom[i]=temp;
return ops;
}
//////////////////////////////////////////////
//s为数字或非数字
int far TString::isNumber(char far s)
{
return (s>='0'&&s<'9');
}
//////////////////////////////////////////////
//转化成数字
int far TString::changeToNum(char far s)
{
if(isNumber(s))
return (s-48);
return-1;
}
// string.cpp TString类的具体实现
///////////////////////////////////////////////
#include"tstring.h"
///////////////////////////////////////////////
//构造函数
TString::TString(long far mLen) //仅定义长度
{
m_lLen=0; //串中元素总数置零
m_lSize=mLen+1;
m_pRoom=new char[m_lSize];
assert(m_pRoom);
for(long i=0;i<m_lSize;i++)
m_pRoom[i]='\0';
}
TString::TString(const char far ch) //字符到类
{
m_lLen=1;
m_lSize=2;
m_pRoom=new char[m_lSize];
assert(m_pRoom);
m_pRoom[0]=ch;
m_pRoom[1]='\0';
}
TString::TString(const char far* pch)//字符串到类
{
m_lLen=strlen(pch);
m_lSize=m_lLen+1;
m_pRoom=new char[m_lSize];
assert(m_pRoom);
strcpy(m_pRoom,pch);
m_pRoom[m_lLen]='\0';
}
///////////////////////////////////////////////
//拷贝构造函数
TString::TString(const TString far& s)
{
m_lLen=s.m_lLen;
m_lSize=s.m_lSize;
m_pRoom=new char[m_lSize];
assert(m_pRoom);
strcpy(m_pRoom,s.m_pRoom);
m_pRoom[m_lLen]='\0';
}
///////////////////////////////////////////////
//析构函数
TString::~TString()
{
delete[] m_pRoom; //无须判空
}
///////////////////////////////////////////////
//返回s中下标为idx的字符
char far TString::StrChar(long far idx)
{
return m_pRoom[idx];
}
///////////////////////////////////////////////
//比较两个TString前n个字符大小
//mode(比较/匹配模式):1:大小写敏感;-1:大小写不敏感
int far TString::StrCompare(const TString far & s1,long far n,int far mode)
{
// if(n<1)n=1;///////////////error
mode= mode>0?1:-1;
switch(mode)
{
case 1:
return memcmp(m_pRoom,s1.m_pRoom,n); //调用string.h中函数实现
case -1:
return memicmp(m_pRoom,s1.m_pRoom,n); //同上
default:
return 1;
}
}
///////////////////////////////////////////////
//长度函数
long far TString::StrLen()
{
return m_lLen;
}
///////////////////////////////////////////////
//连接函数
TString far& TString::StrConcat(const TString far& s1)
{
m_lLen+=s1.m_lLen;
m_lSize=m_lLen+1;
char * reTemp=new char[m_lSize];
assert(reTemp);
if(m_pRoom[0]!='\0')
strcpy(reTemp,m_pRoom);
else
reTemp[0]='\0';
strcat(reTemp,s1.m_pRoom);
delete[] m_pRoom;
m_pRoom=reTemp;
return *this;
}
///////////////////////////////////////////////
//字符位置函数
long far TString::StrCharAt(char far ch,int far mode,long far sn)
{
assert(sn>0);
long times=0,i=0;
for(i=0;i<m_lLen;i++)
if(twoCharCmp(m_pRoom[i],ch,mode)==0&&(++times==sn))
return i;
return -1; //查找失败
}
///////////////////////////////////////////////
//求子串函数,num不可以为负
//num不能出越界,不影响母串
TString far& TString::StrSub(long far sn,long far num)
{
if(sn<1) sn=1;
long currNew=0;
TString* TStringNew;
long sta=sn-1; //设定起点
if(num==0) //复制整个串
{
TStringNew=new TString(m_lLen-sn+1);
while(m_pRoom[sta])
TStringNew->m_pRoom[currNew++]=m_pRoom[sta++];
TStringNew->m_pRoom[currNew]='\0';
TStringNew->m_lLen=m_lLen-sn+1;
}
else
{
TStringNew=new TString(num);
while(currNew<(TStringNew->m_lSize-1))
TStringNew->m_pRoom[currNew++]=m_pRoom[sta++];
TStringNew->m_pRoom[currNew]='\0';
TStringNew->m_lLen=num;
}
return *TStringNew;
}
///////////////////////////////////////////////
//插入函数
TString far& TString::StrInsert(TString far & s1,long far sn)
{
assert(sn);
sn=sn>m_lLen?m_lLen+1:sn; //右越界处理
sn=sn-1;
if(m_lSize<m_lLen+s1.m_lLen+1)
{
m_lSize+=s1.m_lLen;
char* charNew=new char[m_lSize];
long curr=0,curr2=0;
while(curr<sn)
charNew[curr]=m_pRoom[curr++]; //前
while(curr<sn+s1.m_lLen)
charNew[curr++]=s1.m_pRoom[curr2++];//插入
curr2=sn;
while(curr<m_lLen+s1.m_lLen)
charNew[curr++]=m_pRoom[curr2++]; //后
charNew[curr++]='\0'; //置空
delete[] m_pRoom;
m_pRoom=charNew;
}
else
{
long curr=m_lLen-1,curr2=0;
m_pRoom[m_lLen+s1.m_lLen]='\0';
while(curr>=sn)
m_pRoom[curr+s1.m_lLen]=m_pRoom[curr--];//后移
curr=sn;
while(curr<sn+s1.m_lLen)
m_pRoom[curr++]=s1.m_pRoom[curr2++]; //插入
}
m_lLen+=s1.m_lLen;
return *this;
}
///////////////////////////////////////////////
//删除函数
TString far & TString::StrDelete(long far sn,long far num)
{
sn=sn-1;
long currP=sn; //删除子串的首下标
long currB=sn+num; //删除子串后原串首下标
currB= currB<m_lLen?currB:m_lLen;
while(m_pRoom[currB])
m_pRoom[currP++]=m_pRoom[currB++];//移位
while(m_pRoom[currP]) //置零
{
m_pRoom[currP++]='\0';
m_lLen--;
}
return *this;
}
///////////////////////////////////////////////
//删除s中打头空格,返回s
TString far & TString::StrTrimL()
{
long idx=0;
while(m_pRoom[idx]==' ')
idx++;
StrDelete(1,idx);
return *this;
}
///////////////////////////////////////////////
//删除s中尾随空格,返回s
TString far & TString::StrTrimR()
{
long idx=m_lLen-1;
long num=0;
while(m_pRoom[idx]==' ')
{
idx--;
num++;
}
StrDelete(idx,num);
return *this;
}
///////////////////////////////////////////////
//删除s中打头和尾随空格,返回s
TString far & TString::StrTrimLR()
{
StrTrimL();
StrTrimR();
return *this;
}
///////////////////////////////////////////////
//删除s中所有空格,返回s
TString far & TString::StrTrimAll()
{
long idx=0;
while(idx<m_lLen)
if(m_pRoom[idx]==' ')
StrDelete(idx+1,1);
else
idx++;
return *this;
}
///////////////////////////////////////////////
//逆置串
TString far& TString::StrBackspin()
{
return backspin(*this);
}
///////////////////////////////////////////////
//转化为大写
TString far& TString::ToUpper()
{
int i=0;
while(m_pRoom[i])
{
if(isLowerCase(m_pRoom[i]))
m_pRoom[i]=(m_pRoom[i]-'a')+'A';
i++;
}
return *this;
}
///////////////////////////////////////////////
//转化为小写
TString far& TString::ToLower()
{
int i=0;
while(m_pRoom[i])
{
if(!isLowerCase(m_pRoom[i]))
m_pRoom[i]=(m_pRoom[i]-'A')+'a';
i++;
}
return *this;
}
///////////////////////////////////////////////
//转化为整数,也可用stdlib.h中的atoi(char*)实现
long far TString::ToInteger()
{
return atoi(m_pRoom);
}
///////////////////////////////////////////////
//转化为浮点数
double far TString::ToFloat()
{
return atof(m_pRoom);
}
///////////////////////////////////////////////
//将number所表示的数值转化为字符串,作为s的新值
TString far& TString::ToString(double far number,int wd)
{
if(m_pRoom)
delete[] m_pRoom;
m_lSize=wd+6;
m_pRoom=new char[m_lSize];
gcvt(number,wd,m_pRoom);
m_lLen=strlen(m_pRoom);
return *this;
}
///////////////////////////////////////////////
//取子串
TString far& TString::operator ()(long far pos,long far len)
{
return StrSub(pos,len);
}
///////////////////////////////////////////////
//相等比较
int far TString::operator ==(const TString far& ob)
{
long length=ob.m_lLen>m_lLen?m_lLen:ob.m_lLen;
if(StrCompare(ob,length)==0&&ob.m_lLen==m_lLen)
return 1;
else
return 0;
}
///////////////////////////////////////////////
//不等比较
int far TString::operator !=(const TString far& ob)
{
long length=ob.m_lLen>m_lLen?m_lLen:ob.m_lLen;
if(StrCompare(ob,length)==0&&ob.m_lLen==m_lLen)
return 0;
else
return 1;
}
int far TString::operator >(const TString far& ob)
{
long length=ob.m_lLen<m_lLen?m_lLen:ob.m_lLen;
if(StrCompare(ob,length)>0)
return 1;
else
return 0;
}
int far TString::operator <(const TString far& ob)
{
long length=ob.m_lLen<m_lLen?m_lLen:ob.m_lLen;
if(StrCompare(ob,length)<0)
return 1;
else
return 0;
}
///////////////////////////////////////////////
//求非
int far TString::operator !()const
{
return m_lLen!=0;
}
///////////////////////////////////////////////
//赋值
TString far& TString::operator =(const TString far& ob)
{
StrDelete();
return StrConcat(ob);
}
///////////////////////////////////////////////
//连接
TString far& TString::operator +=(const TString far& ob)
{
return StrConcat(ob);
}
///////////////////////////////////////////////
//取字符
char far TString::operator [](int far idx)
{
return StrChar(idx);
}
//////////////////////////////////////////////
//转化成普通字符串
TString::operator const char far*()
{
return m_pRoom;
}
/////////////////////////////////////////////
//输入
istream & operator >>(istream& in,TString far& str)
{
str.StrDelete();
char c=getche();
while(c!='\r')
{
str+=TString(c);
c=getche();
}
cout<<endl;
return in;
}
/////////////////////////////////////////////
//输出
ostream & operator <<(ostream & out,TString far & str)
{
long i=0;
while(str.m_pRoom[i])
out<<str.m_pRoom[i++];
return out;
}
///////////////////////////////////////////////
//判断大小写,s必须为字母
int far TString::isLowerCase(char far s)
{
return ((s>='a')&&(s<='z'));
}
///////////////////////////////////////////////
//带mode比较两字符
int far TString::twoCharCmp(char far s,char far d,int far mode)
{
mode=mode>=0?1:-1;
switch(mode)
{
case 1:
return (s-d);
case -1:
s=s|0xdf;
d=d|0xdf;
return (s-d);
}
return 1;
}
///////////////////////////////////////////////
//逆置串,改变ops并返回
TString far & TString::backspin(TString far & ops)
{
long len=ops.m_lLen-1;
int flag=len%2==0?0:1;
long i=0;
char temp='\0';
while((len-i)!=flag)
{
temp=ops.m_pRoom[len];
ops.m_pRoom[len]=ops.m_pRoom[i];
ops.m_pRoom[i]=temp;
i++;
len--;
}
temp=ops.m_pRoom[len];
ops.m_pRoom[len]=ops.m_pRoom[i];
ops.m_pRoom[i]=temp;
return ops;
}
//////////////////////////////////////////////
//s为数字或非数字
int far TString::isNumber(char far s)
{
return (s>='0'&&s<'9');
}
//////////////////////////////////////////////
//转化成数字
int far TString::changeToNum(char far s)
{
if(isNumber(s))
return (s-48);
return-1;
}