⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 string.cpp

📁 计字符串类并给出其基本操作和运算符重载的算法实现。
💻 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 + -