My_string类__.cpp

#include "stdafx.h"
#include "My_string.h"
#include <cstring>
#include <iostream>
using namespace std;
/*我的string类完成啦!O(∩_∩)O哈哈~超级开心快乐很幸福——BPS就是我~/(≧▽≦)/~啦啦啦——请多多支持!谢谢……咯。*/
int My_string::Num_strings=0;
const unsigned int My_string::npos=4294967295;

//构造函数
My_string::My_string()
{
         len=1;
         str=new char[len];
         str[0]='/0';
         Num_strings++;
}
My_string::My_string(const char* a)
{
         len=strlen(a);
         str=new char[len+1];
         strcpy(str,a);
         Num_strings++;
}
My_string::My_string(const char* a,const int n)
{
         if(n<0)
         {
                   cout<<"下标越界!";
                   len=1;
                   str=new char[len];
                   str[0]='/0';
                   Num_strings++;
                   return;
         }
         int i=0;
         for(;i<n&&a!='/0';i++);
         if(a=='/0')
         {
                   len=strlen(a);
                   str=new char[len+1];
                   strcpy(str,a);
                   str[len]='/0';
                   Num_strings++;
         }
         else
         {
                   len=n;
                   str=new char[len+1];
                   strncpy(str,a,n);
                   str[len]='/0';
                   Num_strings++;
         }
}
My_string::My_string(const My_string& s)
{
         len=strlen(s.str);
         str=new char[len+1];
         strcpy(str,s.str);
         Num_strings++;
}
My_string::My_string(const int n,const char c)
{
         len=n;
         str=new char[len+1];
         for(int i=0;i<len;i++)
                   str=c;
         str='/0';
         Num_strings++;
}
My_string::My_string(const My_string& s,const int pos,const int n)
{

         if(pos>=s.len)
         {
                   cout<<"下标越界!";
                   len=1;
                   str=new char[len];
                   str[0]='/0';
                   Num_strings++;
                   return;
         }
         str=new char[n+1];
         int j=0,i=pos;
         for(;i<pos+n&&s.str!='/0';i++,j++)
                   str[j]=s.str;
         len=j-1;
         str[j]='/0';
         Num_strings++;
}
My_string::My_string(char* begin,char* end)
{

         if(begin>=end)
         {
                   cout<<"不存在区间[begin,end)!";
                   len=1;
                   str=new char[len];
                   str[0]='/0';
                   Num_strings++;
                   return;
         }
         int n=end-begin;
         str=new char[n+1];
         int i=0;
         char* p=begin;
         while(p!=end)
         {
                   str=*p;
                   p++;
                   i++;
         }
         len=i-1;
         str='/0';
         Num_strings++;
}

//析构函数
My_string::~My_string()
{
         delete [] str;
         Num_strings--;
}

//一般函数
My_string& My_string::append(const My_string& s)
{
         return *this+=s;
}
My_string& My_string::append(const My_string& s,const int n)
{
         char* temp=new char[n+1];
         strncpy(temp,s.str,n);
         temp[n]='/0';
         append(temp);
         delete []temp;
         return *this;
}
My_string& My_string::append(const char* a,const int n)
{
         char* temp=new char[n+1];
         strncpy(temp,a,n);
         temp[n]='/0';
         append(temp);
         delete []temp;
         return *this;
}
My_string& My_string::append(const My_string& s,const int m,const int n)
{
         if(m>n)
         {
                   cout<<"前者必须不大于后者!"<<endl;
                   exit(0);
         }
         if(n>=strlen(s.str))
         {
                   cout<<"下标越界!"<<endl;
                   exit(0);
         }
         if(m<0||n<0)
         {
                   cout<<"下标必须不下于零!"<<endl;
                   exit(0);
         }        
         char* temp=new char[n-m+3];
         int i=m,j=0;
         for(;i<=n+1&&s.str!='/0';i++,j++)
         {
                   temp[j]=s.str;
         }
                   temp[j]='/0';
         append(temp);
         return *this;
}
My_string& My_string::append(int n,char c)
{
         char* a=new char[n+1];
         for(int i=0;i<n;i++)
         a=c;
         append(a);
         a='/0';
         return *this;
}

My_string& My_string::assign(const My_string& s)
{
         return *this=s;
}
My_string& My_string::assign(const My_string& s,const int n)
{
         if(n<0)
         {
                   cout<<"非法下标!"<<endl;
                   exit(0);
         }
         char* temp=new char[n+1];
         strncpy(temp,s.str,n);
         temp[n]='/0';
         *this=temp;
         delete []temp;
         return *this;
}
My_string& My_string::assign(const My_string& s,const int m,const int n)
{
         if(m>n)
         {
                   cout<<"参数前者必须大于后者!"<<endl;
                   exit(0);
         }
         if(m<0||n<0)
         {
                   cout<<"非法下标!"<<endl;
                   exit(0);
         }
         char* temp=new char[n-m+3];
         int i=m,j=0;
         for(;i<=n+1&&s.str!='/0';i++,j++)
         {
                   temp[j]=s.str;
         }
         temp[j]='/0';
         *this=temp;
         return *this;
}
My_string& My_string::assign(const int n,const char c)
{
         char* temp=new char[n+1];
         for(int i=0;i<n;i++)
         {
                   temp=c;
         }
         temp='/0';
         *this=temp;
         delete []temp;
         return *this;
}

char& My_string::at(const int n)const
{
         if(n<0||n>=len)
         {
                   cout<<"非法下标!"<<endl;
                   exit(0);
         }
         return str[n];
}
char& My_string::at(const int n)
{
         if(n<0||n>=len)
         {
                   cout<<"非法下标!"<<endl;
                   exit(0);
         }
         return str[n];
}

const char* My_string::c_str()const
{
         return str;
}

int My_string::compare(const My_string& s)const
{
                   return strcmp(str,s.str);
}
int My_string::compare(int pos,int n,const My_string& s)
{
         if(pos<0||pos>len)
         {
                   cout<<"下标越界!";
                   exit(0);
         }
         if(n>len-pos)
                   n=len-pos;
         char* a=new char[n+1];
         for(int i=pos,j=0;i<pos+n;i++,j++)
                   a[j]=str;
         a[j]='/0';
         return strcmp(a,s.str);
}
int My_string::compare(int pos,int n,const My_string& s,int spos,int m)
{
         if(spos<0||spos>s.len)
         {
                   cout<<"下标越界!";
                   exit(0);
         }
         if(m>s.len-spos)
                   m=s.len-spos;
         char* a=new char[m+1];
         for(int i=spos,j=0;i<spos+m;i++,j++)
                   a[j]=str;
         a[j]='/0';
         return compare(pos,n,a);
}

int My_string::copy(My_string& s,const int m,const int n)
{
         int i=0,j=n;
         if(n>len-1)
         {
                   cout<<"下标越界!"<<endl;
                   exit(0);
         }
                   while(j<=n+m-1&&s.str!='/0'&&str[j]!='/0')
                   {
                            s.str=str[j];
                            i++;
                            j++;
                   }
                   if(str[j]=='/0'||j==n+m)
                   {
                            if(str[j]=='/0')
                                     return len-n;
                            else
                                     return m;
                   }
                   else
                   {
                            delete s.str;
                            s.str=new char[m+1];
                            i=0;
                            j=n;
                            while(j<=n+m-1&&str[j]!='/0')
                            {
                                     s.str=str[j];
                                     i++;
                                     j++;
                            }
                            s.str

 

='/0';

                            if(str[j]=='/0')
                                     return len-n;
                            else
                                     return m;
                   }
}
char* My_string::data()
{
         return &str[0];
}

My_string& My_string::erase(const int p0,const int n)
{
         if(p0>=len||p0<0||n<0)
         {
                   cout<<"下标越界!"<<endl;
                   return *this;
         }
         strncpy(str,str,p0);
         if(p0+n>=len)
         {
                   str[p0]='/0';
                   return *this;
         }
         for(int i=p0+n,j=p0;str!='/0';i++,j++)
                   str[j]=str;
         str[j]='/0';
         return *this;
}
unsigned int My_string::find(const My_string& s,int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!"<<endl;
                   return npos;
         }
         int i=pos,j=0;
         for(;str!='/0';i++)
         {
                   if(s.str[j]=='/0')
                            return i-s.len;
                   if(str==s.str[j])
                   {
                            j++;
                            continue;
                   }
                   if(j!=0)
                            i--;
                   j=0;
         }
         if(s.str[j]=='/0')
                   return i-s.len;
         return npos;
}
unsigned int My_string::find(const My_string& s,int pos,int n)const
{
         if(n<0)
         {
                   cout<<"n不能为负数!";
                   return npos;
         }
         if(n>len)
                   n=len;
         char* a=new char[n+1];
         strncpy(a,s.str,n);    
         a[n]='/0';
         return find(a,pos);
}
unsigned int My_string::find(const char c,const int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!";
                   return npos;
         }
         for(int i=pos;str!='/0';i++)
         {
                   if(str==c)
                            return i;
         }
         return npos;
}

unsigned int My_string::rfind(const My_string& s,int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!"<<endl;
                   return npos;
         }
         int i=pos,j=0,k=-1;
         for(;str!='/0';i++)
         {
                   if(s.str[j]=='/0')
                   {
                            k=i;
                            j=0;
                   }

                   if(str==s.str[j])
                   {
                            j++;
                            continue;
                   }
                   if(j!=0)
                   {
                            i--;
                   }
                   j=0;
         }
         if(str=='/0'&&s.str[j]=='/0')
                   return i-s.len;
         if(k!=-1)
                   return k-s.len;
         return npos;
}
unsigned int My_string::rfind(const My_string& s,int pos,int n)const
{
         if(n<0)
         {
                   cout<<"n不能为负数!";
                   return npos;
         }
         if(n>len)
                   n=len;
         char* a=new char[n+1];
         strncpy(a,s.str,n);    
         a[n]='/0';
         return rfind(a,pos);
}
unsigned int My_string::rfind(const char c,const int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!";
                   return npos;
         }
         int i=pos,j=0;
         for(;str!='/0';i++)
         {
                   if(str==c)
                            j=i;
         }
         if(j!=0)
                   return i;
         return npos;
}

unsigned int My_string::find_first_of(const My_string& s,int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!";
                   return npos;
         }        
         for(int i=pos;str!='/0';i++)
                   for(int j=0;s.str[j]!='/0';j++)
                            if(str==s.str[j])
                                     return i;
                            return npos;
}
unsigned int My_string::find_first_of(const My_string& s,int pos,int n)const
{
         if(n<0)
         {
                   cout<<"n不能为负数!";
                   return npos;
         }
         if(n>len)
                   n=len;
         char* a=new char[n+1];
         strncpy(a,s.str,n);    
         a[n]='/0';
         return find_first_of(a,pos);
}
unsigned int My_string::find_first_of(const char c,const int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!";
                   return npos;
         }
         for(int i=0;str!='/0';i++)
                   if(str==c)
                            return i;
                   return npos;
}
unsigned int My_string::find_first_not_of(const My_string& s,int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!";
                   return npos;
         }
         int k=0;
         for(int i=pos;str!='/0';i++)
         {
                   for(int j=0;s.str[j]!='/0';j++)
                            if(str==s.str[j])
                                     k++;
                            if(k==0)
                                     return i;
                            k=0;
         }
         return npos;
}
unsigned int My_string::find_first_not_of(const My_string& s,int pos,int n)const
{
         if(n<0)
         {
                   cout<<"n不能为负数!";
                   return npos;
         }
         if(n>len)
                   n=len;
         char* a=new char[n+1];
         strncpy(a,s.str,n);    
         a[n]='/0';
         return find_first_not_of(a,pos);
}
unsigned int My_string::find_first_not_of(const char c,const int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!";
                   return npos;
         }
         for(int i=pos;str!='/0';i++)
         {
                   if(str!=c)
                            return i;
         }
         return npos;
}
unsigned int My_string::find_last_of(const My_string& s,int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!";
                   return npos;
         }
         int k=-1;
         for(int i=pos;str!='/0';i++)
         {
                   for(int j=0;s.str[j]!='/0';j++)
                   {
                            if(str==s.str[j])
                                     k=i;
                   }
         }
                   if(k!=-1)
                            return k;
                   return npos;
}
unsigned int My_string::find_last_of(const My_string& s,int pos,int n)const
{
         if(n<0)
         {
                   cout<<"n不能为负数!";
                   return npos;
         }
         if(n>len)
                   n=len;
         char* a=new char[n+1];
         strncpy(a,s.str,n);
         a[n]='/0';
         return find_last_of(a,pos);
}
unsigned int My_string::find_last_of(const char c,const int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!";
                   return npos;
         }
         int k=-1;
         for(int i=pos;str!='/0';i++)
         {
                   if(str==c)
                            k=i;
         }
         if(k!=-1)
                   return k;
         return npos;
}
unsigned int My_string::find_last_not_of(const My_string& s,int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!";
                   return npos;
         }
         int k=-1,t=-1;
         for(int i=pos;str!='/0';i++)
         {
                   for(int j=0;s.str[j]!='/0';j++)
                   {
                            if(str==s.str[j])
                                     k=i;
                   }
                   if(k==-1)
                            t=i;
                   k=-1;
         }
                   if(t!=-1)
                            return t;
                   return npos;
}
unsigned int My_string::find_last_not_of(const My_string& s,int pos,int n)const
{
         if(n<0)
         {
                   cout<<"n不能为负数!";
                   return npos;
         }
         if(n>len)
                   n=len;
         char* a=new char[n+1];
         strncpy(a,s.str,n);
         a[n]='/0';
         return find_last_not_of(a,pos);
}
unsigned int My_string::find_last_not_of(const char c,const int pos)const
{
         if(pos<0||pos>=len)
         {
                   cout<<"下标越界!";
                   return npos;
         }
         int k=-1;
         for(int i=pos;str!='/0';i++)
         {
                   if(str!=c)
                            k=i;
         }
         if(k!=-1)
                   return k;
         return npos;
}

My_string& My_string::insert(int pos,const My_string& s)
{
         if(pos<0)
         {
                   cout<<"下标越界!";
                   return *this;
         }
         if(pos>=len)
                   return *this+=s;
         int i=pos,j=0;
         int n=len-pos;
         char* temp=new char[n];
         for(;str!='/0';i++,j++)
         {
                   temp[j]=str;
         }
         temp[j]='/0';
         erase(pos,len);
         *this+=s;
         *this+=temp;
         len=strlen(str);
         return *this;
}
My_string& My_string::insert(int pos,const My_string& s,int n)
{
         if(n<0)
         {
                   cout<<"n不能为负数!";
                   return *this;
         }
         if(n>s.len)
                   n=s.len;
         char* a=new char[n+1];
         strncpy(a,s.str,n);
         a[n]='/0';
         return insert(pos,a);
}
My_string& My_string::insert(int pos,const My_string& s,int spos,int n)
{
         if(spos<0||spos>=s.len)
         {
                   cout<<"下标越界!";
                   return *this;
         }
         if(n<0)
         {
                   cout<<"n不能为负数!";
                   return *this;
         }
         if(n>s.len)
                   n=s.len;        
         int m=n-spos;
         char* a=new char

 

;

         int i=spos,j=0;
         for(;s.str!='/0';i++,j++)
         {
                   a[j]=s.str;
         }
         a[j]='/0';
         return insert(pos,a,n);
}
My_string& My_string::insert(int pos,char c,int n)
{
         char* a=new char[n+1];
         for(int i=0;i<n;i++)
         {
                   a=c;
         }
         a='/0';
         return insert(pos,a,n);
}

const bool My_string::isEmpty()
{
         return strlen(str)==0;
}
const int My_string::length()
{
         return len;
}

My_string& My_string::replace(int pos,int n,My_string& s)
{
         erase(pos,n);
         return insert(pos,s);
}
My_string& My_string::replace(int pos,int n,My_string& s,int m)
{
         if(m>s.len)
                   m=s.len;
         char* a=new char[m+1];
         strncpy(a,s.str,m);
         a

='/0';
         My_string temp=a;
         return replace(pos,n,temp);
}
My_string& My_string::replace(int pos,int n,My_string& s,int spos,int m)
{
         if(spos<0||spos>=s.len)
         {
                   cout<<"下标越界!";
                   return *this;
         }
         if(m>s.len-spos)
                   m=s.len-spos;
         char* a=new char[m+1];
         for(int i=spos,j=0;s.str!='/0';i++,j++)
         {
                   a[j]=s.str;
         }
         a
='/0';
         My_string temp=a;
         return replace(pos,n,temp);
}
My_string& My_string::replace(int pos,int n,int m,char c)
{
         char* a=new char[m+1];
         for(int i=0;i<m;i++)
                   a=c;
         a='/0';
         My_string temp=a;
         return replace(pos,n,temp);
}

const int My_string::size()const
{
         return len;
}
void My_string::swap(My_string& s)
{
         My_string temp=*this;
         *this=s;
         s=temp;
}
//重载运算符
const char& My_string::operator [](int pos)const
{
         if(pos<0||pos>len)
                   return str[len];
         return str[pos];
}
char& My_string::operator [](int pos)
{
         if(pos<0||pos>len)
                   return str[len];
         return str[pos];
}
My_string& My_string::operator =(const My_string& s)
{
         if(this==&s)
                   return *this;
         delete [] str;
         len=s.len;
         str=new char[len+1];
         strcpy(str,s.str);
         str[len]='/0';
         return *this;
}
My_string My_string::operator +(const My_string& s)
{
         My_string temp=*this;
         return(temp+=s);
}
My_string& My_string::operator +=(const My_string& s)
{
         char* a=new char[len+1];
         strcpy(a,str);
         delete []str;
         len+=s.len;
         str=new char[len+1];
         strcpy(str,a);
         strcat(str,s.str);
         delete [] a;
         return *this;
}

bool My_string::operator ==(const My_string& s)
{
         return(!strcmp(str,s.str));
}
bool My_string::operator <(const My_string& s)
{
         return(strcmp(str,s.str)<0);
}
bool My_string::operator >(const My_string& s)
{
         return(strcmp(str,s.str)>0);
}
bool My_string::operator <=(const My_string& s)
{
         return(! (strcmp(str,s.str)>0) );
}
bool My_string::operator >=(const My_string& s)
{
         return(! (strcmp(str,s.str)<0) );
}

ostream& operator <<(ostream& output,My_string& s)
{
         output<<s.str<<endl;
         return output;
}
//这只是开始……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值