第九周阅读程序 具搜索功能的字符串类
来源:互联网 发布:神兽传说java下载 编辑:程序博客网 时间:2024/05/21 18:46
代码
/*对于要定义的字符串类CMyString,数据成员包括:- 字符串的长度;- 指向字符串第一个字符的指针成员函数包括:- 不带参数的构造函数;- 带一个类型为const char *类型的参数(用于对字符串初始化)的构造函数;- 带一个const CMyString&类型的复制构造参数;- 析构函数;- Strlen函数 (用于求字符串的长度);- int Find(char c) (找出字符c在本字符串中第一次出现的位置,并返回其下标;如果本字符串中不包含c,则返回-1);- int Find(const char *str1) ( 找出字符串str1在本字符串中第一次出现的位置,并返回其下标;如果本字符串中不包含字符串str1,则返回-1),- int Find(const CMyString& str1) (找出字符串str1在本字符串中第一次出现的位置,并返回其下标;如果本字符串中不包含字符串str1,则返回-1),- int Replace(char c1, char c2) (将本字符串中出现的所有字符c1用字符c2替换, 返回替换的次数);- void Replace(const char *str1, const char *str2) (将本字符串中第一次出现的字符串str1用字符串str2替换);- void Display() (用于显示字符串)对运算符[]+=等进行重载,例如,设str1和str2是两个CMyString类的对象,- 用str1[i]表示字符串str1的下标为i的字符;- str1+str2的结果是将str2连在str1的后面,并将结果仍然存放在 str1中;- 用=表示赋值。(2)编写主函数,定义几个CMyString类的对象,并利用键盘输入字符串的内容,编程验证以上定义的所有函数。*/#include <iostream>#include <cstring>#include <cstdlib>using namespace std;class CMyString{private: int m_nLen; char *m_szStr;public: CMyString(void); CMyString(const char *str); CMyString(const CMyString& str1); ~CMyString(void); int Strlen(void); int Find(char c); int Find(const char *str1); int Find(const CMyString& str1); int Replace(char c1, char c2); void Replace(const char *str1, const char *str2); char& operator[](int i); CMyString operator+(const CMyString& str1); CMyString& operator=(const CMyString& str1); void Display() { cout<<m_szStr<<endl; };};//注意下面三个构造函数中均要分配存储空间CMyString::CMyString(void){ m_nLen=0; m_szStr=new char[m_nLen+1];//+1的空间用于存放字符串结束标志 strcpy(m_szStr,"");}CMyString::CMyString(const char *str){ m_nLen=strlen(str); m_szStr=new char[m_nLen+1]; strcpy(m_szStr,str);}CMyString::CMyString(const CMyString& str1)//复制构造函数,注意复制构造函数的深复制、浅复制问题,函数体若写成//{//m_szStr=str1.m_szStr;//m_nLen=str1.m_nLen;//}//是不正确的。{ m_nLen=str1.m_nLen; m_szStr=new char[m_nLen+1]; strcpy(m_szStr,str1.m_szStr);}CMyString::~CMyString(void){ delete []m_szStr;}int CMyString::Strlen(void){ return m_nLen;}int CMyString::Find(char c)//找出字符c在本字符串中第一次出现的位置,并返回其下标;如果本字符串中不包含c,则返回-1{ int i=0; while(m_szStr[i]!='\0'&&m_szStr[i]!=c) i++; if (m_szStr[i]=='\0') return -1; else return i;}int CMyString::Find(const char *str1)// 找出字符串str1在本字符串中第一次出现的位置,并返回其下标;如果本字符串中不包含字符串str1,则返回-1{ int len=strlen(str1); int find=0; int i; //将CMyString对象从第i个字符开始的,长度与str1相等的字符串依次与str1比较 for(i=0; i<=m_nLen-len; i++) { find=1; for(int j=0; j<len; j++) if(m_szStr[i+j]!=str1[j]) find=0; if (find) break; } if (find) return i; else return -1;}int CMyString::Find(const CMyString& str1)// 找出字符串str1在本字符串中第一次出现的位置,并返回其下标;如果本字符串中不包含字符串str1,则返回-1{ int len=str1.m_nLen; int find=0; int i; for(i=0; i<=m_nLen-len; i++) { find=1; for(int j=0; j<len; j++) if(m_szStr[i+j]!=str1.m_szStr[j]) find=0; if (find) break; } if (find) return i; else return -1;}int CMyString::Replace(char c1, char c2)//将本字符串中出现的所有字符c1用字符c2替换, 返回替换的次数{ int count=0; for(int i=0; i<m_nLen; i++) { if (m_szStr[i]==c1) { count++; m_szStr[i]=c2; } } return count;}void CMyString::Replace(const char *str1, const char *str2)//将本字符串中第一次出现的字符串str1用字符串str2替换{ int i=Find(str1); //i为srt1在本字符串中首次出现的位置 int j; if (i>=0) { int len1=strlen(str1),len2=strlen(str2); if (len1!=len2) //str1与str2长度不相等 { int len=m_nLen-len1+len2; char *result=new char[len+1]; //求出CMyString对象从str1往后的字符串将其存放与字符串temp中 char *temp; temp=new char[m_nLen-i-len1+1]; for (j=0; j<m_nLen-i-len1; j++) { temp[j]=m_szStr[i+len1+j]; } temp[j]='\0'; ///将CMyString对象中从str1往前的字符串及str2存放与result for(j=0; j<i; j++) result[j]=m_szStr[j]; for(j=0; j<len2; j++) result[i+j]=str2[j]; result[i+j]='\0'; // 将CMyString对象从str1往后的字符串(即temp)添加到当前result(由CMyString对象从str1往前的字符串及str2构成)之后, strcat(result,temp); //用result构造新的*this delete []m_szStr; //释放原有空间,新的字符串空间即result所指的空间 m_szStr=result; m_nLen=len; delete []temp; } else //str1与str2长度相等,直接替换即可 { for(int j=0; j<len1; j++) m_szStr[i+j]=str2[j]; } }}CMyString CMyString::operator+(const CMyString& str1)//本字符串+str1的结果是将str1连在本字符串的后面,并将结果仍然存放在本字符串中{ int len1=str1.m_nLen; int len=m_nLen+len1; int j; char *result=new char[len+1]; for(j=0; j<m_nLen; j++) result[j]=m_szStr[j]; result[j]='\0'; strcat(result,str1.m_szStr); delete []m_szStr; m_szStr=result; m_nLen=len; return *this;}//注意以下两个成员函数返回值必须为引用类型char& CMyString::operator[](int i)//设str1为CMystring类的对象,str1[i]表示str1对应的串中下标为i的字符,{ if (i<0||i>m_nLen-1) { cout<<"index out of range."<<endl; exit(1); } return m_szStr[i];}CMyString& CMyString::operator=(const CMyString& str1){ int len1=str1.m_nLen; if (m_nLen!=len1) { delete []m_szStr; m_szStr=new char[len1+1]; m_nLen=len1; } strcpy(m_szStr,str1.m_szStr); return *this;}int main(){ //所有输出信息中的字符串序列号均从0开始 char *str="Hello!"; /*下面分别用 CMyString(void); CMyString(const char *str); CMyString(const CMyString& str1); 三种方式构造字符串对象str1、str2、str3*/ CMyString str1,str2(str),str3(str2); cout<<"str1 is:"; str1.Display(); cout<<"str2 is:"; str2.Display(); cout<<"str3 is:"; str3.Display(); cout<<"length of str2 is:"<<str2.Strlen()<<endl; //int Find(char c);的验证 cout<<"'H' is the "<<str2.Find('H')+1<<" char in str2"<<endl; cout<<"'!' is the "<<str2.Find('!')+1<<" char in str2"<<endl; cout<<"'s' is the "<<str2.Find('s')+1<<" char in str2"<<endl; //int Find(const char *str1);的验证 cout<<"\"ell\" is from "<<str2.Find("ell")+1<<" char in str2"<<endl; cout<<"\"o\" is from "<<str2.Find("o")+1<<" char in str2"<<endl; cout<<"\"Heli\" is from "<<str2.Find("Heli")+1<<" char in str2"<<endl; //int Find(const CMyString& str1);的验证 char *str_1=new char[20],*str_2=new char[20]; cout<<"input a string:"; //下面的方法用于输入一行不超过20个字符,以回车为结束的可包含空格的字符串 //cin>>str_1;不能输入带空格的字符串 cin.getline(str_1,20,'\n'); cout<<"input the string to be finded:"; cin.getline(str_2,20,'\n'); CMyString str4(str_1),str5(str_2); cout<<str4.Find(str5)<<endl; delete[]str_1; delete[]str_2; //int Replace(char c1, char c2);的验证 char *str_3=new char[20]; char c1,c2; cout<<"input a string:"; cin.getline(str_3,20,'\n'); cout<<"input c1:"; cin>>c1; cout<<"input c2:"; cin>>c2; CMyString str6(str_3); cout<<"replace "<<'\''<<c1<<'\''<<" of "<<"this string"<<" with "<<'\''<<c2<<'\''<<' '; cout<<str6.Replace(c1,c2)<<" times "<<endl<<"after replace the string is: "; str6.Display(); delete[]str_3; //void Replace(const char *str1, const char *str2);的验证 char *str_4=new char[20]; char str_5[5],str_6[5]; cout<<"input a string:"; cin.getline(str_4,20,'\n'); //用于提取缓冲区中剩余的'\n' cin.getline(str_4,20,'\n'); //正式输入字符串 cout<<"input the str1 in this string to be changed:"; cin>>str_5; cout<<"input the str2 you want to change to:"; cin>>str_6; CMyString str7(str_4); cout<<"replace first time of "<<"\""<<str_5<<"\""<<" in this string with "<< "\""<<str_6<<"\""<<" is "; str7.Replace(str_5,str_6); str7.Display(); //运算符[]+=的验证 cout<<"the 2nd charcter after replace is:"<<str7[2]<<endl; return 0;}
0 0
- 第九周阅读程序 具搜索功能的字符串类
- 第九周阅读程序配备了搜索功能的字符串类
- 第九周 课后实践:阅读程序——(2)配备了搜索功能的字符串类
- 第九周 程序阅读-字符串类的设计
- 第九周阅读程序二:字符串类的设计
- 第九周项目零:阅读程序(2):字符串类的设计
- 第九周 《C++语言基础》程序阅读——字符串类的设计
- 第九周-程序阅读
- 第九周阅读程序
- 第九周练习 阅读程序
- 第九周-程序阅读理解
- 第九周阅读程序3
- 第九周-阅读程序1
- 第九周阅读程序2
- 第九周阅读程序3
- 第九周阅读程序简单的学生信息管理系统
- 第九周项目:程序阅读 类和指针
- 第九周项目:程序阅读 类和指针
- Time 类中的运算符重载(续)
- 第九周 【项目4-我的向量类】
- 一个模仿途牛旅行应用源码
- 大数据
- shell启动sublime
- 第九周阅读程序 具搜索功能的字符串类
- ibatis自动生成键selectkey(Oracle、MYSQL、MSSQL、SQLITE)
- 2015年大一下第7周项目5-方程也是类
- R语言 矩阵运算
- 从汇编到AWK
- ios开发进阶,从Xcode开始
- android:windowSoftInputMode属性详解
- 使用CocoaPods来管理Objective-c的类库,自动联想补齐头文件
- Python学习