自定义字符串操作

来源:互联网 发布:软件助手ios版 编辑:程序博客网 时间:2024/06/18 13:36
#include<iostream>#include<cstdlib>#include<vector>#include<iomanip>using namespace std;class HString{private:char kind[2];//操作类型char *str;                                      //字符串int  length;                                    //字符串长度public:HString(){str=NULL;//初始化length=0;}void SetKind(char s)//设置操作类型{kind[0]=s;kind[1]='\0';}char* getKind()//获取操作类型{return kind;}char* getStr()//获取字符串{return str;}void InitHString(char *s)//初始化自定义字符串{      length=0;str=new char[100];while(*s){str[length++]=*s;s++;}str[length]='\0';}void getLength()//获取字符串的长度{cout<<length<<endl;}void Equality(char* s)//判断两字符串是否相等{char *pStr,*pStr1;pStr = str;pStr1 = s;        while(*pStr && *pStr1 && *pStr==*pStr1) pStr++,pStr1++;if(*pStr==*pStr1 && *pStr=='\0')cout<<"EQUAL"<<endl;elsecout<<"UNEQUAL"<<endl;}void CatHString(char* s)//字符串联接{   int i=0;       while(*s)   {   str[length+i++]=*s;   s++;   }   length+=i;   str[length]='\0';}void HStringSub(int a,int b)                     //获取子串,a为初始下标位置,b为子串的长度{      char str1[100];  if(a+b>length) b=length-a; //如果越界,重置  for(int i=a;i<a+b;i++)  str1[i-a]=str[i];  str1[b]='\0';  cout<<str1<<endl;}void index(char *s)             //获取相同子串的初始位置{if(s==NULL) {cout<<"错误"<<endl;return;}char *p=str,*q=s;int len=0,flag=0;while(*q) len++,q++;q=s;while(*p!='\0'){q=s;if(*p==*q)    //如果第一个字符相等,进入循环,如果q==NULL 说明s是子串while(*q && *p && *p==*q) {p++;q++;}    elsep++;if(*q=='\0') {flag=1;break;}}if(flag==1) //如果找到,要减去s的长度就是初始位置,否则输出错误cout<<p-str-len<<endl;elsecout<<"参数非法"<<endl;}void replace(char *s,char *s1)  //代替函数{if(s1==NULL || s==NULL) {cout<<"错误"<<endl;return;}      char *p=str,*q=s,dst[100],*k;int len=0,flag=0,i=0,j;while(*q) len++,q++;q=s;while(*p!='\0'){q=s;dst[i]=*p;if(*p==*q)while(*q && *p && *p==*q) {dst[i]=*p;p++;q++;i++;}    elsep++,i++;if(*q=='\0')  //如果找到子串{flag=1;                k=s1;i-=len; //说明之前做的赋值没作用while(*k){dst[i++]=*k++;}}}dst[i]='\0';cout<<dst<<endl;}};void Show(vector<HString>&vt)                             //显示操作类型和字符串{vector<HString>::iterator it=vt.begin(); //迭代器遍历for(;it!=vt.end();++it){cout<<it->getKind()<<" "<<it->getStr()<<endl;}}void Delete(vector<HString>&vt,char ch)  //删除同类型的操作{vector<HString>::iterator it=vt.begin();if(ch>='a' && ch<='z') ch=ch-32;for(;it!=vt.end();)if(it->getKind()[0]==ch || it->getKind()[0]==ch+32){   it=vt.erase(it);}elseit++;}void main(){char ch;vector<HString> vtHStr;cout<<"*******************************字符串的操作******************************"<<endl;cout<<"A.赋值"<<"E.判相等"<<"C.联接"<<"L:求长度"<<"S.求子串"<<"I.子串定位"<<"R.串替换"<<"P.显示"<<"D.删除"<<"Q.退出"<<endl;while(1){HString str;char s[100],s1[100];int a,b;cin>>ch;str.SetKind(ch);switch(ch){case 'A':case 'a':cin>>s;str.InitHString(s);cout<<str.getStr()<<endl;vtHStr.push_back(str);break;case 'E':case 'e':cin>>s;            str.InitHString(s);cin>>s;str.Equality(s);vtHStr.push_back(str);break;case 'C':case 'c':cin>>s;str.InitHString(s);cin>>s;str.CatHString(s);cout<<str.getStr()<<endl;vtHStr.push_back(str);break;case 'L':case 'l':cin>>s;str.InitHString(s);str.getLength();vtHStr.push_back(str);break;case 'S':case 's':cin>>s;str.InitHString(s);cin>>a>>b;str.HStringSub(a,b);vtHStr.push_back(str);    break;case 'I':case 'i':cin>>s;str.InitHString(s);cin>>s;str.index(s);vtHStr.push_back(str);break;case 'R':case 'r':            cin>>s;str.InitHString(s);cin>>s;cin>>s1;str.replace(s,s1);vtHStr.push_back(str);break;case 'P':case 'p':Show(vtHStr);break;case 'D':case 'd':cin>>ch;Delete(vtHStr,ch);break;case 'Q':case 'q':return ;}}}

0 0
原创粉丝点击