自定义一个String 类用来存储字符串,串中的字符存放在动态分配的数组中,该类拥有以下成员函数:构造函数:为对象分配动态存储空间,完成初始化,要考虑多种参数的重载形式,例如无参数、参数类型为char 或char*;析构函数:将占用的动态存储空间释放;拷贝构造函数:实现String 对象之间的深拷贝构造;IsSubstring 函数:判断参数是否为当前串的子串,参数可以为char*或String 类型;Str2Num 函数:将数字字符串转成数值;UpperStr 函数:将字符串中的小写字母均转为大写字母;ReplaceStr 函数:替换String 中的某个字符串;ReplaceChar 函数:替换String 中的某个字符;DelStr 函数:删除String 中的某个字符串;DelChar 函数:删除String 中的某个字符;重载了以下运算符:= 运算符:实现String 对象之间的深拷贝赋值;+ 运算符:将两个String 对象首尾相连;[] 运算符:访问String 对象中某个下标位置的字符;<<运算符:输出String 对象;自行设计类中的数据成员和其它内容,并编写测试代码使用该Sting 类。
#include<iostream.h>#include<string.h>#include<assert.h>class String{private: char * str; int size;public: String();//创建一个空字符串 String(char *s);//创建一个初值为s的字符串 ~String();//消除改串的实例 void print();//输出 String substr(int pos,int n);//从位置pos开始提取一个长度为n的子串 int length();//返回串的长度 int isempty();//判断串是否为空 void clear();//把串清空 String append(const char c);//在串尾添加字符 String insert(const char c,const int index);//在串中给定位置插入一个字符 String concatenate(const char *s);//把串s接在本串后面 int find(const char c,const int start);//从位置start开始搜寻一个给定字符 String copy(const char *s);//将一个s串复制到本串}; String::String(){ size=0; str=NULL;} String::~String() { } String::String(char *s) { size=strlen(s); str=new char[size+1]; assert(str!='\0'); strcpy(str,s); } void String::print() { if(str!=NULL) cout<<str<<endl; else cout<<"空串"<<endl; } String String:: substr(int pos,int n) { int i; int left=size-pos; String tmp; char *p,*q; if(pos>=size) return NULL; if(n>left) n=left; delete[] tmp.str; tmp.str=new char[n+1]; assert(tmp.str!=NULL); p=tmp.str; q=&str[pos]; for(i=0;i<n;i++) *p++=*q++; *p='\0'; tmp.size=n; cout<<tmp.str<<endl; return tmp; } int String::isempty() { if (str=='\0') { cout<<"空窜"<<endl; return 1; } return 0; } int String::length() { return size; } void String::clear() { str=NULL; size=0; } String String::append(const char c) { String tt; tt.str=new char(size+2); assert(tt.str!='\0'); tt.str[size+1]='\0'; strcpy(tt.str,str); tt.str[size]=c; str=new char(size+2); assert(str!='\0'); strcpy(str,tt.str); size=size+1; cout<<str<<endl; return str; } String String::insert(const char c,const int index) { String tt; tt.str=new char(size+2); assert(tt.str!='\0'); tt.str[size+1]='\0'; strcpy(tt.str,str); if(index>size) cout<<"插入失败"<<endl; else { for(int i=size;i>index;i--) tt.str[i]=tt.str[i-1]; tt.str[index]=c; str=new char(size+2); strcpy(str,tt.str); size=size+1; cout<<str<<endl; } return str; } String String::concatenate(const char *s) { String tt; char *p; tt.str=new char(size+strlen(s)+1); assert(tt.str!='\0'); tt.str[size+strlen(s)]='\0'; strcpy(tt.str,str); p=&tt.str[size]; strcpy(p,s); str=new char(size+strlen(s)+1); strcpy(str,tt.str); size=size+strlen(s); cout<<str<<endl; return str; } int String::find(const char c,const int start) { if(start<0 || start>size) { cout<<"查询失败"<<endl; return 0; } int i=start; while(str[i]!=c && i<=size) i++; if(str[i]==c) { cout<<i<<endl; return 1; } if(i>size) { cout<<"查找失败"<<endl; return 0; } } String String::copy(const char *s) { String tt; tt=new char(strlen(s)+1); assert(tt.str!='\0'); strcpy(tt.str,s); str=tt.str; cout<<str<<endl; return tt; } void main() { String a("jhg"); a.concatenate("aaaa"); a.insert('w',3); //a.concatenate("aaaa"); a.append('q');a.concatenate("aaaa"); }我运行过正确 不过没用重载 追问 谢谢你了 (*^__^*) ……可是必须用重载的.....而且运行有错误 我用的Dev-C++
没有全部测试,你先看看,有问题再提!//String.h#ifndef STRING_H#define STRING_H#include <iostream>using namespace std;#define string Stringclass string{public: char* str; string(); string(char ch); string(char* text); ~string(); string(const string& astring); int IsSubstring(char* str); int IsSubstring(string& astring); int Str2Num(); void UpperStr(); void ReplaceStr(char* str1,char* str2); void ReplaceChar(char ch1,char ch2); void DelStr(char* string); void DelChar(char ch); string& operator=(string& astring); string& operator+(string& astring); char operator[](int index); friend ostream& operator<<(ostream& out,string& astring);};#endif//String.cpp#include "string.h"#include <cassert>#include <iostream>#include <cmath>using namespace std;#define string Stringstring::string(){ str=new char[30];};string::string(char ch){ str=new char[30]; for(int i=0;i<30;i++) { str[i]=ch; }};string::string(char* text){ str=new char[strlen(text)+1]; strcpy(str,text);};string::~string(){ delete []str;};string::string(const string& astring){ str=new char[strlen(astring.str)+1]; strcpy(str,astring.str);};int string::IsSubstring(char* astr){ return strcmp(str,astr);};int string::IsSubstring(string& astring){ int ret=0; assert(str!=NULL,astring.str!=NULL); while((ret=str++-(astring.str)++)==0); return ret;};int string::Str2Num(){ int length=strlen(str)-1; int num=0; int index=0; while(length>=0) { num+=(*(str+length--)-48)*pow(10,index++); } return num;};void string::UpperStr(){ assert(str); int length=strlen(str); int index=0; while(index<length) { if(islower(*(str+index))) { *(str+index)=toupper(*(str+index)); index++; } else { index++; } }};void string::ReplaceStr(char* str1,char* str2){ if(strlen(str1)==strlen(str2)) { int length=strlen(str); int length2=strlen(str2); bool ismatch=0; int index1=0; int index2=0; for(int i=0;i<length;i++) { if(*(str+i)==*str1) { ismatch=1; for(int j=i;j<i+length2;j++) { if(*(str+j)!=*(str1+index1++)) { ismatch=0; } } if(ismatch==1) { for(int m=i;m<i+length2;m++) { *(str+m)=*(str2+index2++); } index1=0; index2=0; } } } }};void string::ReplaceChar(char ch1,char ch2){ int length=strlen(str); for(int i=0;i<length;i++) { if(*(str+i)==ch1) { *(str+i)=ch2; } }};void string::DelStr(char* string){ int length1=strlen(str); int length2=strlen(string); bool ismatch=0; int index=0; for(int i=0;i<length1;i++) { if(*(str+i)==*string) { ismatch=1; for(int j=i;j<i+length2;j++) { if(*(str+j)!=*(string+index++)) { ismatch=0; } } if(ismatch==1) { for(int m=i;m<length1;m++) { *(str+m)=*(str+m+length2); } length1-=length2; index=0; } } }};void string::DelChar(char ch){ int length=strlen(str); for(int i=0;i<length;i++) { if(*(str+i)==ch) { for(int j=i;j<length;j++) { *(str+j)=*(str+j+1); } length--; } }};string& string::operator=(string& astring){ char* text=new char[strlen(astring.str)+1]; strcpy(text,astring.str); str=text; return *this;};string& string::operator+(string& astring){ int length1=strlen(str); int length2=strlen(astring.str); char* text=new char[length1+length2]; for(int i=0;i<length1;i++) { *(text+i)=*(str+i); } int index=0; for(int j=length1;j<length2;j++) { *(text+j)=*((astring.str)+index++); } str=text; return *this;};char string::operator[](int index){ assert(str); int length=strlen(str); if(index<length) { return *(str+index-1); }};ostream& operator<<(ostream& out,string& astring){ assert(astring.str); out<<astring.str<<'\n'; return out;}//main#include <iostream>#include "string.h"using namespace std;int main(){ String astring("fuck your mother"); astring.UpperStr(); cout<<astring<<endl; String tstring(astring); cout<<tstring<<endl; cout<<astring.IsSubstring("FUCK YOUR MOTHER")<<endl; String cstring("12345"); cout<<cstring.Str2Num()<<endl; astring.ReplaceStr("YOUR","HERS"); cout<<astring<<endl; astring.DelStr("HERS"); cout<<astring<<endl;} 追问 谢谢大侠,运行报错误....assert函数未定义 追答 不会呀,我在我电脑运行是好的呀,把你邮箱给我发给你! 追问 我QQ365146105