#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
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
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
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;
}
//这只是开始……