#include <iostream>
#include <string>
#include <assert.h>
//声明命名空间
using namespace std;
//认真理解操作符重载的使用方法.
class CString
{
public://standard constructor;
CString();
CString(char *p);
CString(CString &c);
~CString();
public://public functions;
CString operator=(char *p);
CString operator+(char *p);
CString operator+(CString &m);
CString operator=(CString &m);
bool operator==(CString &m);
bool operator>=(CString &m);
void Display();
int GetLength();
char* GetBuffer(int minlen);
CString Left(int len);
CString Right(int len);
bool Compare(CString &strDes);
bool Compare(char *sDes);
int Find(char *strSub,int nstart=0); //查找子串
CString Replace(char *subOld,char *subNew,int start=0);
CString Delete(int nIndwx,int nCount =1);
CString Insert(int nIndex,char *pstr);
CString Remove(char *pstr,int start=0);
CString Mid(int nFirst,int nEnd);
CString Trim(char *strDest,int nstart);//剪掉从nstart开始的字符串
private://private members;
char* m_pStr;
int m_len;
char* GetStr();
};
二,实现部分
#include "CString.h"
#include <malloc.h>
CString::CString()
{
m_pStr = NULL;
m_len = 0;
}
CString::CString(char *p)
{
m_pStr = new char[strlen(p)+1];
strncpy(m_pStr,p,strlen(p)+1);
m_len = strlen(p);
}
CString::CString(CString &c)
{
m_pStr = new char[strlen(c.GetStr())+1];
strncpy(m_pStr,c.GetStr(),strlen(c.GetStr())+1);
}
CString::~CString()
{
//delete [] m_pStr;
}
char * CString::GetStr()
{
return m_pStr;
}
int CString::GetLength()
{
return m_len;
}
CString CString::operator=(CString &m)
{
memcpy(this,&m,sizeof(*this));
return(*this);
}
CString CString::operator=(char *p)
{
CString strRet(p);
return strRet;
}
bool CString::operator==(CString &m)
{
char *sSoure = m.GetStr();
if(strcmp(m_pStr,sSoure))
return false;
else
return true;
}
CString CString::operator +(CString &m)
{
int len = m.GetLength();
char *tem;
tem = new char[len + m_len+1];
strcpy(tem,m_pStr);
strcat(tem,m.GetStr());
CString strRet(tem);
return strRet;
}
CString CString::operator +(char *p)
{
int len =strlen(p);
char *tem;
tem= new char[len + m_len];
strcpy(tem,m_pStr);
strcat(tem,p);
CString strRet(tem);
return strRet;
}
char * CString::GetBuffer(int minlen)
{
if(minlen > m_len)
minlen = strlen(m_pStr);
char *p;
p =new char[minlen];
for(int i=0;i<minlen;i++)
*(p+i) = *(m_pStr+i);
return p;
}
CString CString::Left(int len)
{
if(len > m_len)
len =m_len;
char *p;
p = new char[len];
for(int i =0;i< len;i++)
*(p+i) = *(m_pStr +i);
CString strRet(p);
return strRet;
}
CString CString::Right(int len)
{
int j=0;
if(len > m_len)
len = m_len;
char *p;
p = new char[len];
for(int i =m_len - len;i < m_len;i++)
{
*(p+ j) = *(m_pStr +i);
j++;
}
CString strRet(p);
return strRet;
}
void CString::Display()
{
cout<<m_pStr<<endl;
}
bool CString::Compare(CString &strDes)
{
char *p =strDes.GetStr();
if(!strcmp(m_pStr,p))
return true;
else
return false;
}
bool CString::Compare(char *sDes) //比较子串是否相等;
{
if(!strcmp(m_pStr,sDes))
return true;
else
return false;
}
int CString::Find(char *subStr,int start) //从start开始,查找子串subStr的第一个位置.
{
assert(start < m_len);
int i=start;
int j=0,pos=0,len =strlen(subStr);
if(len > m_len)
return -1;
else
{
while(m_pStr[i] !='\0') //没有结束
{
if(m_pStr[i] != subStr[j])
{
i++;
j=0;//从下一个字符串开始比较
}
else //有相同的字符串
{
if(j==0)
pos =i;
i++;
j++;
if(j == len)
return pos;
if(i == m_len)
return -1;
}
}
return -1;
}
}
CString CString::Replace(char *subOld,char *subNew,int start) //返回替换后新的字符串
{
int i;
int pos =Find(subOld,start);
if(pos == -1)
return *this; //表明没有替换的,返回原来的串;
else //表明有子串,位置为pos;
{
char *p1,*p2;
if(pos >=1)
{
p1 = new char[pos+1];//长度+1;
for(i=0;i<pos;i++)
p1[i] = m_pStr[i];
p1[i] = '\0';
}
else
p1="";
if((pos + (int)strlen(subOld)) < m_len) //说明后面还有字符串
{
int j=0;
p2 = new char[m_len-pos-(int)strlen(subOld)+1];
for(i=pos+(int)strlen(subOld);i<m_len;i++)
{
*(p2+j) = *(m_pStr+i);
j++;
}
p2[j] ='\0';
}
else
p2="";
char *p3 = new char[(int)strlen(subNew) +(int)strlen(p2)];
strcpy(p3,subNew);
strcat(p3,p2);
char *p4 = new char[(int)strlen(p3) +(int)strlen(p1)];
strcpy(p4,p1);
strcat(p4,p3);
delete p1;
delete p2;
CString strRet(p4);
return strRet;
}
}
CString CString::Delete(int nIndex,int nCount)//删除从nIndex开始的nCount个字符,得到新的的字符串.
{
assert((nIndex +nCount) <= m_len);
char *p1,*p2;
int i;
if(nIndex >= 1) //表明删除前面还有字符串
{
p1 = new char[nIndex+1];
for(i=0;i<nIndex;i++)
*(p1+i) = *(m_pStr+i);
p1[i] ='\0';
}
else
p1="";
if((nIndex + nCount) < m_len) //表明后面还有字符串
{
p2 = new char[m_len - nIndex -nCount+1];
int j=0;
for(i=nIndex+nCount;i<m_len;i++)
{
*(p2+j) = *(m_pStr +i);
j++;
}
p2[j] = '\0';
}
else
p2="";
char *tem =new char[m_len -nCount];
strcpy(tem,p1);
strcat(tem,p2);
delete p1;delete p2;
CString strRet(tem);
return strRet;
}
CString CString::Insert(int nIndex,char *pstr) //在nIndex前面位置插入子串pstr;
{
assert(nIndex >= 0 && nIndex < m_len);
char *p1,*p2,*p3;
p1 = new char[nIndex + 1];
for(int i=0;i<nIndex;i++)
p1[i] = m_pStr[i];
p1[i] ='\0';
p2 = new char[m_len -nIndex + 1];
int j=0;
for(i=nIndex;i<m_len;i++)
{
p2[j] = m_pStr[i];
j++;
}
p2[j] = '\0';
p3 = new char[(int)strlen(p2) + (int)strlen(pstr)];
strcpy(p3,pstr);
strcat(p3,p2);
char *tem = new char[m_len + (int)strlen(pstr)];
strcpy(tem,p1);
strcat(tem,p3);
delete p1;delete p2;
CString strRet(tem);
return strRet;
}
CString CString::Remove(char *pstr,int start)
{
int pos =Find(pstr,start);
if(pos == -1)
return *this;
else
{
int len = strlen(pstr);
char *p1,*p2;
if(pos >= 1)
{
p1 = new char[pos+1];
for(int i=0;i<pos;i++)
p1[i] = m_pStr[i];
p1[i] = '\0';
}
else
p1="";
if(pos + len < m_len)
{
p2 = new char[m_len- pos-len+1];
int j=0;
for(int i=pos+len;i<m_len;i++)
{
p2[j] = m_pStr[i];
j++;
}
p2[j] ='\0';
}
char *tem = new char[m_len - len];
strcpy(tem,p1);
strcat(tem,p2);
CString strRet(tem);
return strRet;
}
}
CString CString::Mid(int nFirst,int nEnd) //得到从nFirst到nEnd的字符串
{
assert(nFirst >=0 && nFirst <= nEnd && nEnd < m_len);
char *p1;
p1 =new char[nEnd - nFirst +2];
int j=0;
for(int i=nFirst;i < nEnd;i++)
{
p1[j] = m_pStr[i];
j++;
}
p1[j] ='\0';
CString strRet(p1);
return strRet;
}