📄 string.cpp
字号:
#include<iostream.h>
#include<string.h>
#include<assert.h>
class String
{
private:
char *a;
int size;
public:
String ();
String (char *s);
String (const String &s);
String &operator=(char *s);
String &operator=(String &s);
String operator+(char *s);
String operator+(String &s);
friend String operator+(char *s1,String &s2);
char& operator[](int n);
int operator<(char *s);
int operator<(String &s);
friend int operator<(char *s1,String s2);
friend istream &operator>>(istream &in,String &s);
friend ostream &operator<<(ostream &out,String &s);
String insert(String& s1,int pos);
String insert(char *s,int pos);
String Delete(int index,int count);
int strlength();//注意。不能写成strlen,因为与系统的函数strlen名字一致
bool empty();
String substr(int index,int count);
int FindLast(char ch);
int Findfront(char ch);
int Find(char ch,int start);
void findchar(char *x,char &y,int &t);
void replace(char x,char y);
~String();
};
//构造函数。
String::String()
{
a="";
size=0;
}
String::String(char *s)
{
size=strlen(s);
a=new char[size+1];
assert(a!=NULL);
strcpy(a,s);
}
//有指针存在时要定义拷贝构造函数,防止指针悬挂。
String::String(const String &s)
{
/* if(size!=0)
{delete []a;}*/
//不能如此写,因为此函数执行前size的值不确定。(它并没有调用string())
size=s.size;
a=new char[size+1];
assert(a!=NULL);
strcpy(a,s.a);
}
String &String::operator=(char *s)
{
if(size!=0)
delete []a;
size=strlen(s);
a=new char[size+1];
strcpy(a,s);
assert(a!=NULL);
strcpy(a,s);
return *this;
}
String &String::operator=(String &s)
{
if(size!=0)
delete []a;
size=s.size;
a=new char[size+1];
assert(a!=NULL);
strcpy(a,s.a);
return *this;
}
String String::operator+(char *s1)
{
String s;
if(s.size!=0)
delete []s.a;//注意a有空间时要删除空间。
s.size=strlen(s1)+size;
s.a=new char[s.size+1];
assert(s.a!=NULL);
strcpy(s.a,a);
strcat(s.a,s1);
return s;
}
String String::operator+(String &s1)
{
String s;
if(s.size!=0)
delete []s.a;
s.size=size+s1.size;
s.a=new char[s.size+1];
assert(s.a!=NULL);
strcpy(s.a,a);
strcat(s.a,s1.a);
return s;
}
String operator+(char *s1,String &s2)
{
String s;
if(s.size!=0)
delete []s.a;//shanchukongjian
s.size=strlen(s1)+s2.size;
s.a=new char[s.size+1];
assert(s.a!=NULL);
strcpy(s.a,s1);
strcat(s.a,s2.a);
return s;
}
//重载[]号。
char& String::operator[](int n)
{
if(n<0||n>size)
{
cout<<"字符串越界"<<endl;
return a[size];
}
else
return a[n];
}
//重载<号。
int String::operator<(char *s)
{
return strcmp(a,s);
}
int String::operator<(String &s)
{
return strcmp(a,s.a);
}
int operator<(char *s1,String s2)
{
return strcmp(s1,s2.a);
}
//重载输入输出流。
istream &operator>>(istream &in,String &s)
{
in>>s.a;
return in;
}
ostream &operator<<(ostream &out,String &s)
{
out<<s.a;
return out;
}
bool String::empty()
{
return size==0;
}
//在本串pos位置上插入一个字符串S1。
String String::insert(String& s1,int pos)
{//与下面的函数类似,只需要注意一个为string一个为char *形
String s;
if(pos<0)
pos=0;
if(pos>=size)
pos=size;
s.size=size+s1.size;
s.a=new char[s.size+1];
strcpy(s.a,a);
int i=pos+s1.size;
int j=pos;
for(;i<s.size;i++,j++)
s.a[i]=s.a[j];
for(int m=0;m<s1.size;m++)
s.a[m+pos]=s1.a[m];
if(size!=0)
delete []a;
size=s.size;
a=new char[size+1];
strcpy(a,s.a);
s.a[s.size]='\0';
a[size]='\0';
return s;
}
String String::insert(char *s1,int pos)
{
//必须要先申请一个string,因为本串长度要改变,而本串的数字要保留,不能在插入前就delete掉
String s;
if(pos<0)
pos=0;
if(pos>=size)
pos=size;
s.size=size+strlen(s1);
s.a=new char[s.size+1];
strcpy(s.a,a);
int i=pos+strlen(s1);
int j=pos;
for(;i<s.size;i++,j++)
s.a[i]=s.a[j];//先要将pos+strlen(s1)后面的字符改为插入前的字符,再插入 。
for(int m=0;m<strlen(s1);m++)
s.a[m+pos]=s1[m];
s.a[s.size]='\0';
if(size!=0)
delete []a;
size=s.size;//s为insert后的函数,而本串未改变,因此还需要将本串的内容改变。
a=new char[size+1];
strcpy(a,s.a);
a[size]='\0';
return s;
}
String String::Delete(int index,int count)
{
if(index>size-1)
return *this;
if(index>size-count)
count=size-index;
int i=index;
for(;i<size-count;i++)
a[i]=a[i+count];
a[i]='\0';
return *this;
}
int String::strlength()
{
return size;
}
String String::substr(int index,int count)//获取从下标index开始长度为count的子串
{
assert(index>=0);
int left=size-index;
String temp;
if(temp.size!=0)
delete []temp.a;
if(index>=size)
return temp;
if(left<count)
count=left;
temp.a=new char [count+1];
for(int i=0;i<count;i++)
temp.a[i]=a[i+index];
temp.a[i]='\0';
temp.size=count;
return temp;
}
//从本串头查找字符ch,找到后返回它在本串中的出现的位置。
int String::Findfront(char ch)
{
for(int i=0;i<size;i++)
{
if(a[i]==ch)
return i;
}
return -1;
}
//从本串末尾查找字符ch,找到后返回它在本串中的出现的位置。
int String::FindLast(char ch)
{
for(int i=size-1;i<=0;i--)
{
if(a[i]==ch)
return i;
}
return -1;
}
//从start下标开始找字符。
int String::Find(char ch,int start)
{
for(int i=start;i<size;i++)
{
if(a[i]==ch)
return i;
}
return -1;
}
////找出本串中第一个不在x中出现的字符及其位置
void String::findchar(char *x,char &y,int &t)
{
int j=strlen(x);
for(int m=0;m<size;m++)
{
int k=0;//注意K应在里面定义为0。
for(int i=0;i<j;i++)
{
if(a[m]==x[i])
{
k++;break;//一旦本串中的字符和x的一样,break,跳入下面的循环找。
}
}
if(k==0)
{
y=a[m];
t=m;
}
else
{
y='\0';t=0;//找不到字符,返回空
}
}
}
void String::replace(char x,char y)
{
for(int i=0;i<size;i++)
{
if(a[i]==x)
a[i]=y;
}
}
String::~String()
{
//注意,size为0时,a为NULL,不能delete掉。
if(size!=0)
delete[]a;
}
void main()
{char y;int t;
String A="",B="MULE",C="OLD",D="MY";
cout<<"A="<<A<<" "<<"B="<<B<<" "<<"C="<<C<<" "<<"D="<<D<<endl;
cout<<"A+B="<<A+B<<endl;
cout<<"B+A="<<B+A<<endl;
cout<<"D+C+B="<<D+C+B<<endl;
cout<<"B中从下标为3的长度为2的子串为:"<<B.substr(3,2)<<endl;
cout<<"C中从下标为1的长度为1的子串为:"<<C.substr(1,1)<<endl;
cout<<"A的长度为:"<<A.strlength()<<endl;
cout<<"D的长度为:"<<D.strlength()<<endl;
cout<<"从头开始找,在B中出现字符L的第一个下标为:"<<B.Findfront('L')<<endl;
cout<<"从头开始找,在C中出现字符D的第一个下标为:"<<C.FindLast('D')<<endl;
cout<<"在串D的第2个下标上插入B后,B为:"<<D.insert(B,2)<<endl;
cout<<"在串B的第1个下标后插入B后,B为:"<<B.insert(B,1)<<endl;
cout<<"在B中的第2个下标删除2个字符后为"<<B.Delete(2,2)<<endl;
cout<<"在B中的第0个下标删除5个字符后为"<<B.Delete(0,5)<<endl;
C.findchar("LOYOU",y,t);
cout<<"C中第一个不在LOYOU中出现的字符为"<<y<<" 位置是"<<t<<endl;
D.replace('M','G');
cout<<"D中的字符M被G取代后,D为"<<D<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -