📄 mystring.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 + -