1 //class mstring
2 //function:
3 // friend function :
4 // +,<<,>>,
5 // member function:
6 // get_length,<,>,==,printf,
7
8 #include<cstring>
9 #include<iostream>
10 #include<istream>
11 #include<ostream>
12 class mstring{
13 friend const mstring operator+(const mstring&str1,const mstring&str2);//0514修改,添加 const,防止出现a+b=c的情况;
14 friend const mstring operator+(const char*str1,const mstring&str2);
15 friend const mstring operator+(const mstring&str1,const char*str2);
16 friend std::ostream&operator<<(std::ostream&os,const mstring&str);
17 friend std::istream&operator>>(std::istream&is,mstring&str);
18 public:
19 mstring();
20 mstring(char*str);
21 mstring(const mstring& str);
22 mstring(int n);
23 ~mstring(){
24 delete[]m_data;
25 }
26 mstring& operator=(char*str);
27 mstring& operator=(const mstring&str);
28 bool operator<(const mstring&str)const;
29 bool operator>(const mstring&str)const;
30 bool operator==(const mstring&str)const;
31 void printf()const;
32 int get_length()const{
33 return strlen(m_data);
34 }
35 mstring substring(int i,int j)const;
36 private:
37 char*m_data;
38
39 };
40
41 mstring::mstring(){
42 m_data=new char;
43 *m_data='\0';
44 }
45 mstring::mstring(char*str){
46 m_data=new char[strlen(str)+1];
47 strcpy(m_data,str);
48 }
49 mstring::mstring(const mstring&str){
50 m_data=new char[strlen(str.m_data)+1];
51 strcpy(m_data,str.m_data);
52 }
53 mstring::mstring(int n){
54 m_data=new char[n+1];
55 int i=0;
56 for(i=0;i<n;i++){
57 m_data[i]='0';
58 }
59 m_data[n]='\0';
60 }
61 mstring& mstring::operator=(char*str){
62 delete [] m_data;
63 m_data=NULL;
64 m_data=new char[strlen(str)+1];
65 strcpy(m_data,str);
66 return *this;
67 }
68 mstring& mstring::operator=(const mstring&str){
69 if(this==&str) return *this;
70 delete []m_data;
71 m_data=NULL;
72 m_data=new char[strlen(str.m_data)+1];
73 strcpy(m_data,str.m_data);
74 return *this;
75 }
76 bool mstring::operator<(const mstring&str)const{
77 if(strcmp(this->m_data,str.m_data)<0) return true;
78 else return false;
79 }
80 bool mstring::operator>(const mstring&str)const{
81 if(strcmp(this->m_data,str.m_data)>0) return true;
82 else return false;
83 }
84 bool mstring::operator==(const mstring&str)const{
85 if(strcmp(this->m_data,str.m_data)==0) return true;
86 else return false;
87 }
88
89 const mstring operator+(const mstring&str1,const mstring&str2){
90 int l1=str1.get_length();
91 int l2=str2.get_length();
92 mstring tmp(l1+l2);
93 for(int i=0;i<l1;i++){
94 tmp.m_data[i]=str1.m_data[i];
95 }
96 for(int i=0;i<l2;i++){
97 tmp.m_data[l1+i]=str2.m_data[i];
98 }
99 return tmp;
100
101 }
102
103 const mstring operator+(const char*str1,const mstring&str2){
104 int l1=strlen(str1);
105 int l2=str2.get_length();
106 mstring tmp(l1+l2);
107 for(int i=0;i<l1;i++){
108 tmp.m_data[i]=str1[i];
109 }
110 for(int i=0;i<l2;i++){
111 tmp.m_data[l1+i]=str2.m_data[i];
112 }
113 return tmp;
114 }
115
116 const mstring operator+(const mstring&str1,const char*str2){
117 int l1=str1.get_length();
118 int l2=strlen(str2);
119 mstring tmp(l1+l2);
120 for(int i=0;i<l1;i++){
121 tmp.m_data[i]=str1.m_data[i];
122 }
123 for(int i=0;i<l2;i++){
124 tmp.m_data[l1+i]=str2[i];
125 }
126 return tmp;
127 }
128
129 std::ostream&operator<<(std::ostream&os,const mstring&str){
130 os<<str.m_data;
131 return os;
132 }
133
134 std::istream&operator>>(std::istream&is,mstring&str){
135 char buf[1024];
136 is>>buf;
137 str=buf;
138 return is;
139 }
140
141 void mstring::printf()const{
142 for(int i=0;m_data[i]!=0;i++){
143 std::cout<<m_data[i];
144 }
145 std::cout<<std::endl;
146 }
147
148 mstring mstring::substring(int i,int j)const{
149 int strlength=strlen(this->m_data);
150 if(i>j||i>strlength-1||j<0){
151 mstring mtemp;
152 return mtemp;
153 }
154 if(i<0) i=0;
155 if(j>strlength-1) j=strlength-1;
156 mstring mtemp(j-i+1);
157 int index=0,k=0;
158 for(index=0;index<=strlength-1;index++){
159 if(index>=i&&index<=j)
160 {
161 mtemp.m_data[k++]=this->m_data[index];
162 }
163 }
164 return mtemp;
165 }
166
167 int main(){
168 mstring ms,ms2,ms3;
169 ms="adbc";
170 ms2=ms;
171 ms.printf();
172 ms2.printf();
173 std::cout<<ms.get_length();
174 std::cout<<std::endl;
175 ms3=ms2.substring(1,5);
176 ms3.printf();
177 mstring ms4,ms5;
178 std::cin>>ms4;
179 std::cin>>ms5;
180 std::cout<<ms4<<std::endl;
181 std::cout<<ms5<<std::endl;
182 ms5=ms4+ms5;
183 std::cout<<ms5<<std::endl;
184 return 0;
185 }
186
187