codeblocks
gcc version 4.9.2 (tdm-1)
构造方法 | 描述 |
---|---|
String(char *s,int len) | 构造方法初始化数据 |
成员方法 | 描述 |
---|---|
char *getStr() | 获取当前的String(打印) |
int getLength() | 获取当前String的长度 |
char *Strcpy(char *s) | 字符串的复制 |
char *Strcat(char *s) | 字符串的连接 |
int Compare(char *b) | 字符串的比较 |
char *substring(int sub_start,int sub_end) | 指定起始终止位置求子串 |
void exchange(char *s) | 字符串的交换 |
int BF_Find_String(char *s) | 在当前字符串String中查找子串 |
int indexOf(char index) | 查找某字符在当前String中第一次出现的位置 |
void toUpperCase() | 字符串小写转大写 |
void toLowerCase() | 字符串大写转小写 |
char *trim() | 消除字符串中的空格 |
char *SplitStr() | 消除{,!”“#$%&’()*+,-./}的字符 |
void set(int index,char letter) | 在指定字符串的指定位置添加某字符 |
- #include< iostream>
- #include< string.h>
- #include< fstream>
- #include< malloc.h>
/************************************************************************* > File Name: 重写string类 > Author: 浅然 > Mail: xulinjie0105@gmail.com > Created Time: 2018年05月21日 星期一 14时11分34秒 ************************************************************************/ #include<iostream> #include<string.h> #include<fstream> #include<malloc.h> using namespace std; char s[15];//读取文件中的数据时存储在s数组中 /* *String *成员属性:*str,length *成员方法: 1.显示构造器:String(char *s,int len) 2.析构器:~String() 3.获取此时的string:char *getStr() 4.获取此时的length:int getLength() 5.字符串的复制:char *Strcpy(char *s) 6.字符串的连接:char *Strcat(char *s) 7.字符串的比较:int Compare(char *b) 8.求子串:char *substring(int sub_start,int sub_end) 9.字符串的交换:void exchange(char *s) 10.查找字符串(BF):int BF_Find_String(char *s) 11.求出现某字符在指定字符串中第一次出现的位置:int indexOf(char index) 12.字符串小写转大写:void toUpperCase() 13.字符串大写转小写:void toLowerCase() 14.消除字符串中的空格:char *trim() 15.消除{,!""#$%&'()*+,-./}的字符:char *SplitStr() 16.在指定字符串的指定位置添加某字符: void set(int index,char letter) */ class String { //成员变量 private: char *str; int length; //构造器 public: String(char *s,int len) { str=new char[strlen(s)+1]; strcpy(str,s); length=len; } //析构器 ~String() { delete[] str; } /* *获取此时的string */ char *getStr(){ return str; } /* *获取此时的length */ int getLength(){ return length; } /* *字符串的复制 */ char *Strcpy(char *s){ char *destinaton=new char[strlen(s)+1];//为destinaton开辟内存空间 strcpy(destinaton,s); //将s复制给destinaton if(destinaton!=NULL){ //如果destinaton不为空,说明复制完成,且成功 cout<<"复制完成"<<endl; } if(str) delete[]str; //释放str指向的内存 str=destinaton; //将str指向destinaton所指向的地址(赋值) length=strlen(destinaton); //此时所用的字符串长度更新 return str; } /* *字符串的连接 */ char *Strcat(char *s){ char *original = new char[strlen(s)+strlen(str)+1];//为original开辟内存空间 strcpy(original,str); //将str复制给original strcat(original,s); //将s与original连接 if(original!=str){ //如果original与str不相等,说明连接完成,且成功 cout<<"连接完成"<<endl; } return original; } /* *字符串的比较 */ int Compare(char *b){ int flag = 0; //比较大小标志域 int com = strcmp(str,b); //比较函数,得出大小 if(com == 0){ //com==0得出str==b cout<<str<<"和"<<b<<"相等"<<endl; flag=0; } else if(com<0){ //com<0得出str<b cout<<str<<"小于"<<b<<endl; flag=-1; } else if(com>0){ //com>0得出str>b cout<<str<<"大于"<<b<<endl; flag=1; } return flag; } /* *求子串 *设置开始和结束位置求出子串 */ char *substring(int sub_start,int sub_end) { char *low_string=new char[sub_end-sub_start+1];//为low_string开辟内存空间 int i=sub_start; //i初始化为所求子串在父串的初始位置 int j=0; //j为递增变量 while(i<=sub_end){ //确定i的范围,为low_string赋值 low_string[j++] = str[i++]; } low_string[j]='\0'; return low_string; } /* *字符串的交换 */ void exchange(char *s) { char *temp_str = new char[length]; //为临时存放str的temp_str,开辟内存 char *temp_s = new char[strlen(s)+1]; //为临时存放s的temp_s开辟内存 cout<<"交换之前 :"<<s<<"\t"<<str<<endl;//打印交换前 strcpy(temp_str,str); //将str复制给temp_str,下同 strcpy(temp_s,s); str=temp_s; //实现更新交互,更新str的值,下同 s=temp_str; cout<<"交换之后 :"<<s<<"\t"<<str<<endl;//打印交换后 } /* *查找字符串(BF) *设置从某位置开始查找子串 */ int BF_Find_String(char *s) { int a,b; int i=0,j=0; a=strlen(str); b=strlen(s); j=0; cout<<(" 请输入数i,代表从主串s哪个位置开始\n"); cin>>i; while(j<b && i<a) { if(str[i]==s[j]) { i++; j++; } else { i=i-j+2; j=1; } } if(j>=b){ cout<<"匹配成功,查找成功\n"; return 1; } else{ cout<<"匹配失败,查找失败\n"; return -1; } } /* *求出现某字符在指定字符串中第一次出现的位置 */ int indexOf(char index) { for(int i = 0;i < strlen(str);i++){ if(str[i] == index){ return i+1; } } return 0; } /* *字符串小写转大写 */ void toUpperCase() { for(int i = 0; str[i]!='\0';i++){ if( str[i]>='a' && str[i]<='z'){ str[i] = str[i]-32; } } } /* *字符串大写转小写 */ void toLowerCase() { for(int i =0;str[i]!='\0';i++){ if(str[i]>='A' && str[i]<='Z'){ str[i] = str[i]+32; } } } /* *消除字符串中的空格 */ char *trim() { int j = 0; int count = 0; char *s = new char[strlen(str)+1]; for(int i = 0;i<strlen(str);){ //消除空格 if(str[i] == ' '){ i++; continue; }else{ s[j++] = str[i]; i++; } } s[j]='\0'; //字符串结束 return s; } /* *字符串分割 *消除{,!""#$%&'()*+,-./}的字符 */ char *SplitStr() { int j = 0; char *s = new char[strlen(str)+1]; for(int i = 0 ;i < strlen(str);){ if((int)str[i] >= 33 && (int)str[i] <= 47){ i++; }else{ s[j++] = str[i]; i++; } } s[j] = '\0'; return s; } /* *将字符添加到字符串指定位置 */ void set(int index,char letter) { int i; str = (char*)realloc(str,strlen(str)*2); for(i = strlen(str)-1 ; i > index;i--){ str[i+1] = str[i]; } str[i+1] = str[i]; str[i] = letter; length++; } /* *字符串翻转 */ char *reverse_str() { char temp; char *temp_s = new char[strlen(str)+1]; strcpy(temp_s,str); //拷贝str到temp_s中 int i,j; for(i=0; ;i++) { if(*(temp_s+i)=='\0') break; } //求字符串长度 i--; for(j=0;j<=i;i--,j++) { temp=*(temp_s+j); *(temp_s+j)=*(temp_s+i); *(temp_s+i)=temp; } return temp_s; //字符串翻转 } }; /* *以下是文件写入操作 1.字符串复制结果写入文件:void write_copy(char s1[30]) 2.字符串连接结果写入文件:void write_connect(char s1[30]) 3.字符串比较(compare)结果写入文件:void write_compare(char s1[15],char s2[15],int flag) 4.将所求子串写入文件:void write_substring(char s1[15],char s2[15],int sub_start,int sub_end) 5.字符串交换前后数据写入文件:void write_exchange(char s1[15],char s2[15],int flag) 6.字符串的查找结果写入文件:void write_BF_Find_String(char str[15],char s[15],int find_string_value) 7.将某字符在字符串第一次出现的位置写入文件:void write_indexOf(char str[15],char index,int pos) 8.将转换大小写结果写入文件:void write_LowerAndUpperCase(char s1[15],char s2[15]) 9.消除字符串中的空格后结果写入文件: void write_trim(char s1[15],char s2[15]) 10.消除常用标点符号,!""#$%&'()*+,-./的结果写入文件:void write_SplitStr(char s1[15],char s2[15]) 11.将某字符添加到某字符串的某个位置的结果写入文件:void write_set(char s1[15],char s2[15],int index,char one_letter) 12.将字符串翻转后写入文件: void write_reverse_str(char s1[15],char s2[15]) 13.起始写入文件的字符串:void write_initvalue(int n) 14.读取文件指定位置的字符串:char * read(int count) */ /* *copy结果写入文件 */ void write_copy(char s1[30]) { ofstream out;//向文件写入数据 //out:以写的方式打开 //ate:打开文件后立即定位到文件末尾 //app:每次写操作前均定位到文件末尾 out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out){ cout<<"文件打开失败!"<<endl; } out<<"字符串复制\n"; out<<"copy:"<<s1<<"\n\n"; out.close(); } /* *connect结果写入文件 */ void write_connect(char s1[30]) { ofstream out;//向文件写入数据 out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out){ cout<<"文件打开失败!"<<endl; } out<<"字符串连接\n"; out<<"connect:"<<s1<<"\n\n"; out.close(); } /* *字符串比较(compare)结果写入文件 */ void write_compare(char s1[15],char s2[15],int flag) { ofstream out;//向文件写入数据 out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out){ cout<<"文件打开失败!"<<endl; } out<<"字符串比较\n"; if(flag == 0) out<<s1<<"等于"<<s2<<"\n\n"; else if(flag == -1) out<<s1<<"小于"<<s2<<"\n\n"; else if(flag == 1) out<<s1<<"大于"<<s2<<"\n\n"; out.close(); } /* *将所求子串写入文件 */ void write_substring(char s1[15],char s2[15],int sub_start,int sub_end) { ofstream out;//向文件写入数据 out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out){ cout<<"文件打开失败!"<<endl; } out<<"求子串\n"; out<<s2<<"通过起始位置:"<<sub_start<<"和结束位置"<<sub_end<<"所求的子串"<<s1<<"\n\n"; out.close(); } /* *字符串交换前后数据写入文件 */ void write_exchange(char s1[15],char s2[15],int flag) { ofstream out;//向文件写入数据 out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out){ cout<<"文件打开失败!"<<endl; } out<<"字符串交换\n"; if(flag){ out<<"字符串交换后: old_string:"<<s1<<"\t"<<"new_string:"<<s2<<"\n\n"; }else{ out<<"字符串交换前: old_string:"<<s1<<"\t"<<"new_string:"<<s2<<"\n\n"; } } /* *字符串的查找结果写入文件 */ void write_BF_Find_String(char str[15],char s[15],int find_string_value) { ofstream out; out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out){ cout<<"文件打开失败!"<<endl; } out<<"字符串查找\n"; if(find_string_value == 1){ out<<str<<"与"<<s<<"匹配成功,查找成功\n\n"; } else if(find_string_value == -1){ out<<str<<"与"<<s<<"匹配失败,查找失败\n\n"; } } /* *将某字符在字符串第一次出现的位置写入文件 */ void write_indexOf(char str[15],char index,int pos) { ofstream out; out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out){ cout<<"文件打开失败!"<<endl; } out<<"查找"<<index<<"在"<<str<<"中第几号位置第一次出现亦或没有\n"; if(pos){ out<<index<<"在"<<str<<"的第:"<<pos<<"\n\n"; } else{ cout<<index<<"没有出现在string中\n\n"; } } /* *将转换大小写结果写入文件 */ void write_LowerAndUpperCase(char s1[15],char s2[15]) { ofstream out; out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out) { cout<<"文件打开失败!"<<endl; } out<<"字符串大小写转换\n"; out<<s1<<"转换为"<<s2<<"\n\n"; out.close(); } /* *消除字符串中的空格后结果写入文件 */ void write_trim(char s1[15],char s2[15]) { ofstream out; out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out) { cout<<"文件打开失败!"<<endl; } out<<"忽略"<<s1<<"中的空格 : "<<s2<<"\n\n"; } /* *消除常用标点符号,!""#$%&'()*+,-./的结果写入文件 */ void write_SplitStr(char s1[15],char s2[15]) { ofstream out; out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out) { cout<<"文件打开失败!"<<endl; } out<<"忽略"<<s1<<"中的标点 : "<<s2<<"\n\n"; } /* *将某字符添加到某字符串的某个位置的结果写入文件 */ void write_set(char s1[15],char s2[15],int index,char one_letter) { ofstream out; out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out) { cout<<"文件打开失败!"<<endl; } out<<s1<<"在"<<index<<"位置添加"<<one_letter<<"后 : "<<s2<<"\n\n"; } /* *将字符串翻转后写入文件 */ void write_reverse_str(char s1[15],char s2[15]) { ofstream out; out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out) { cout<<"文件打开失败!"<<endl; } out<<s1<<"通过字符串翻转 : "<<s2<<"\n\n"; } /* *起始写入文件的字符串 */ void write_initvalue(int n) { ofstream out; int i=0; out.open("d:\\j33.txt",ios::out); if(!out) { cout<<"文件打开失败!"<<endl; } cin.ignore(1); while(i<n) { char s1[20]; cout<<"input "<<i+1<<" string :"; cin.getline(s1,15); out<<s1<<"\n"; i++; } out<<"\n"; out.close(); } /* *读取文件指定位置的字符串 */ char * read(int count) { ifstream in; //从文件读取数据 in.open("d:\\j33.txt",ios::in); //以读的方式打开 if(!in){ cout<<"文件打开失败!"<<endl; return NULL; } while(count){ in.getline(s,15); //从第一行开始,读到第count次,读到count行 count--; } in.close();//关闭流 return s; } /* *修饰作用(横线) */ void decorate() { ofstream out; out.open("d:\\j33.txt",ios::out|ios::ate|ios::app); if(!out) { cout<<"文件打开失败!"<<endl; } for(int i = 0;i < 40;i++){ cout<<"-"; out<<"-"; } out<<"\n\n"; }
1、目录
文章来源: C++ 重写String类