Cstring 类实现

 

#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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值