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

📄 mystring.h

📁 把数据结构里面的字符串类实现了,可以方便大家用来学习。
💻 H
字号:
#ifndef STRINGH
#define STRINGH

#include <iostream>
#include <string>
#include "stdafx.h"

using namespace std;
class String{
private:
	char *p;
	int size;
public:
	String();
	String(const char *str);
	String(const String &str);
	~String();
	int Length();
	int Find(const String &pat,int start);
	String SubStr(int pos,int lengh);
	char *Str_C();
	void Insert(String &ob,int pos);
	void Delete(int pos,int length);
	operator char * ();
    char &operator [](int n);
	friend ostream & operator << (ostream &os,String &ob);
	friend istream & operator >> (istream &is,String &ob);
	String operator =(String &ob);
	String operator = (char *str);
	String operator + (String &ob);
	String operator + (char *str);
	
	//串对象之间的关系运算符
	int operator ==(String & ob){return strcmp(p,ob.p)==0?1:0;}
	int operator !=(String & ob){return strcmp(p,ob.p)==0?0:1;}
	int operator >(String & ob){return strcmp(p,ob.p)>0?1:0;}
	int operator <(String & ob){return strcmp(p,ob.p)<0?1:0;}
	int operator >=(String & ob){return strcmp(p,ob.p)<0?0:1;}
	int operator <=(String & ob){return strcmp(p,ob.p)>0?0:1;}

	//串对象与字符串之间的关系运算符号
	int operator ==(char * ob){return strcmp(p,ob)==0?1:0;}
	int operator !=(char * ob){return strcmp(p,ob)==0?0:1;}
	int operator >(char * ob){return strcmp(p,ob)>0?1:0;}
	int operator <(char * ob){return strcmp(p,ob)<0?1:0;}
	int operator >=(char *  ob){return strcmp(p,ob)<0?0:1;}
	int operator <=(char * ob){return strcmp(p,ob)>0?0:1;}
};

String::String(){
	size=1;
	p=new char[size];
	if(p==NULL)
	{
		cerr<<"分配失败!"<<endl;
		exit(1);
	}
	p=NULL;
}

String::String(const char *str){
	size=strlen(str)+1;
	p=new char[size];
	if(p==NULL)
	{
		cerr<<"分配失败!"<<endl;
		exit(1);
	}
	strcpy(p,str);
}

String::String(const String &str){
	size=strlen(str.p)+1;
	p=new char[size];
	if(p==NULL)
	{
		cerr<<"分配失败!"<<endl;
		exit(1);
	}
	strcpy(p,str.p);
}

String::~String(){
	delete p;
}

int String::Length(){
	return size;
}

int String::Find(const String &pat, int start){//start is from 0 to size-1
	if(pat.size+start+1>size)
	{//can not find this str
		return -1;
	}
	char *pTemp=new char[pat.size];
	int begin=start;
	while(begin+pat.size+1<=size)
	{
		strncpy(pTemp,p+begin,pat.size);
		pTemp[pat.size-1]=NULL;//必须加这行代码,使它成为一个字符串
		if(strcmp(pTemp,pat.p)==0)
			return begin;//find the str
		begin++;
	}
	return -1;//can not find the str
}

String String::SubStr(int pos, int length){
	char *pTemp;
	pTemp=new char[length+1];
	strncpy(pTemp,p+pos,length);
	pTemp[length]=NULL;
	String str(pTemp);
	return str;
}

char * String::Str_C()
{
	return p;
}

void String::Insert(String &ob, int pos){
	int len=ob.size;
	size+=len-1;
	char *p2=new char[size];
	
	int i=0,j=0;
	for(;i<pos;i++,j++)
		p2[i]=p[j];
	for(int k=0;i<pos+len-1;i++,k++)//一定要注意把字符串中的null去掉。因为len包括NULL,所以必须小心。
		p2[i]=ob.p[k];
	for(;i<size;i++,j++)
		p2[i]=p[j];
	delete p;
	p=new char[size];
	//strcpy(p,p2);
	strncpy(p,p2,size);
	delete p2;
}

void String::Delete(int pos, int length){
	if(pos+length>size)
		cerr<<"删除的字符串长度已经越界,不执行该命令。"<<endl;
	else
	{
		size-=length;
		char *p2=new char[size];
		int ip1,ip2;
		for(ip1=0,ip2=0;ip1<pos;ip1++,ip2++)
			p2[ip1]=p[ip2];
		for(ip2=ip2+length;ip1<size;ip1++,ip2++)
			p2[ip1]=p[ip2];
		delete p;
		p=new char[size];
		strcpy(p,p2);
	}
}

String::operator char *()
{
	return p;
}

char &String::operator [](int n){
	if(n>size-1)
	{
		cerr<<"越界"<<endl;
		exit(1);
	}
	return p[n];
}

String String::operator =(String &ob)
{
	if(p==ob.p)
		return *this;//do nothing,beacause it's self-assignment
	delete p;
	size=ob.size;
	p=new char [size];
	if(p==NULL)
	{
		cerr<<"分配失败!"<<endl;
		exit(1);
	}
	strcpy(p,ob.p);
	return *this;
}

String String::operator =(char *str)
{
	delete p;
	size=strlen(str)+1;
	p=new char [size];
	if(p==NULL)
	{
		cerr<<"分配失败!"<<endl;
		exit(1);
	}
	strcpy(p,str);
	return *this;
}

String String::operator +(String &ob){
	char *pTemp=new char[size+ob.size-1];
	if(pTemp==NULL)
	{
		cerr<<"分配失败!"<<endl;
		exit(1);
	}
	strcpy(pTemp,p);
	int i=0;
	for(;i<ob.size;i++)
		*(pTemp+size-1+i)=*(ob.p+i);
	delete p;
	size=size+ob.size-1;
	p=new char[size];
	if(p==NULL)
	{
		cerr<<"分配失败!"<<endl;
		exit(1);
	}
	strcpy(p,pTemp);
	return *this;
	//String temp;
	//temp.Insert(this,0);
	//temp.Insert(ob,size-1);
	//return temp;
}

String String::operator +(char *str){
	char *pTemp=new char[size+strlen(str)];
	if(pTemp==NULL)
	{
		cerr<<"分配失败!"<<endl;
		exit(1);
	}
	strcpy(pTemp,p);
	int i=0;
	for(;i<strlen(str)+1;i++)
		*(pTemp+size-1+i)=*(str+i);
	delete p;
	size=size+strlen(str);
	p=new char[size];
	if(p==NULL)
	{
		cerr<<"分配失败!"<<endl;
		exit(1);
	}
	strcpy(p,pTemp);
	return *this;
}

ostream & operator << (ostream &stream,String &ob)
{
	stream<<ob.p;
	return stream;
}

istream &operator >> (istream &stream,String & ob)
{
	char t[255];
	int len;
	for(len=0;len<255;len++)
	{
		stream.get(t[len]);
		if(t[len]=='\n')
			break;
		if(t[len]=='\b')
			if(len!=0)
			{
				len--;
				cout<<"'\b'";
			}
	}
	t[len]='\0';
	len++;
	if(len>ob.size)//改变ob大小
	{
		ob.size=len;
		delete ob.p;
		ob.p=new char[ob.size];
		if(ob.p==NULL)
		{
			cerr<<"分配失败!"<<endl;
			exit(1);
		}
	}
	strcpy(ob.p,t);
	return stream;
}
 #endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -