String 类的实现(3)String类常用函数

 
  1 
  2 #include<iostream>
  3 #include<stdio.h>
  4 #include<assert.h>
  5 #include <iomanip>
  6 using namespace std;
//自己模拟实现的部分相关C——string库函数
  8 int my_strlen(const char *p)
  9 {
 10     int count = 0;
 11     assert(p);
 12     while (*p != '\0')
 13     {
 14         p++;
 15         count++;
 16     }
 17     return count;
 18 }
 19 char* my_strcopy(char* dest, const char* str)
 20 {
 21     assert(dest != NULL);
 22     assert(str != NULL);
 23     char* ret = dest;
 24     while (*dest++ = *str++)
 25     {
 26         ;
 27     }
 28     return ret;
 29 }
 30 int my_strcmp(const char *str1, const char *str2)
 31 {
 32     while (*str1 == *str2)
 33 {
 34     if (*str1 == '\0')
 35         return 0;
 36     else
 37         {
 38             str1++;
 39             str2++;
 40         }
 41     }
 42     return (*str1 - *str2);
 43 }
 44 char *my_strcat(char *dst, const char *str)
 45 {
 46     char *ret = dst;
 47     assert(dst != NULL);
 48     assert(str != NULL);
 49     while (*dst != '\0')
 50     {
 51         dst++;
 52     }
 53     while (*dst++ = *str++)
 54     {
 55         ;
 56     }
 57     return ret;
 58 }
 59 char *my_strstr(const char *str, const char *substr)
 60 {
 61     const char *str1 = NULL;
 62     const char *str2 = NULL;
 63     const char *start = str;
 64     assert(str);
 65     assert(substr);
 66     if (*substr == NULL)
 67     {
 68         return (char *)str;
 69     }
 70     while (*start)
 71     {
 72         str1 = start;
 73         str2 = substr;
 74         while ((*str1) && (*str2) && (*str1 == *str2))
 75         {
 76             str1++;
 77             str2++;
 78         }
 79         if (*str2 == '\0')
 80         {
 81             return (char *)start;
 82         }
 83         start++;
 84     }
 85     return NULL;
 86 }
 87 
 88 class String
 89 {
 90 public:
 91         String(const char *pStr = "")  //string类的构造函数 
 92         {
 93             if (pStr == NULL)
 94             {
 95                 _pStr = new char[1];
 96                 *_pStr = '\0';
 97             }
 98             else
 99             {
100                 _pStr = new char[my_strlen(pStr) + 1];
101                 my_strcopy(_pStr, pStr);
102             }
103         }
104     
105         String(const String& s)     //拷贝构造函数
106             :_pStr(new char[my_strlen(s._pStr)] + 1)
107         {
108             if (this != &s)
109             {
110                 my_strcopy(_pStr, s._pStr);
111             }
112         }
113     
114         ~String()     //析构函数
115         {
116             if (_pStr)
117                 delete[] _pStr;
118             _pStr = NULL;
119         }
120     
121         String& operator=(const String& s)   赋值运算符重载
122         {
123             if (this != &s)
124             {
125                 char *temp = new char[my_strlen(s._pStr) + 1];
126                 my_strcopy(temp, s._pStr);
127                 delete[] _pStr;
128                 _pStr = temp;
129             }
130             return *this;
131         }
132     
133     char& operator[](size_t index)    
134     {
135         if (GetCount() > 1)     
136         {
137             char* pTem = new char[my_strlen(_pStr) + 1 + 4];
138             my_strcopy(pTem + 4, _pStr);
139             --GetCount();       
140             _pStr = pTem + 4;
141             GetCount() = 1;
142         }
143         return _pStr[index];
144     }
145     const char& operator[](size_t index)const
146     {
147         return _pStr[index];
148     }

  输入输出操作1.>> 从输入流读取一个string。2.<< 把一个string写入输出流。另一个函数就是getline(),他从输入流读取一行内容,直到遇到分行符或到了文件尾。

149     friend ostream& operator<<(ostream& output, const String& s)
150     {
151         output << s._pStr;
152         return output;
153     }
154     friend istream &operator >> (istream &input, String &s)
155     {
156         char temp[250]; 
157         input >> setw(255) >> temp;
158         s = temp; 
159         return input;   
160     }
161     bool StrStr(const String& s)
162     {
163         String newString;
164         if (!s._pStr)
165             newString = *this;
166         else if (!_pStr)
167             newString = s;
168         char* ret = my_strstr(_pStr, s._pStr);
169         if (ret != NULL)
170             return true;
171         else
172             return false;
173     }
174     
175     String operator+(const String &s)const  //把字符串s连接到当前字符串的结尾  同C-sring中的石strcat()函数;
176     {
177         String newString;
178         if (!s._pStr)
179             newString = *this;
180         else if (!_pStr)
181             newString = s;
182         else
183         {
184             newString._pStr = new char[my_strlen(_pStr) + my_strlen(s._pStr) + 1];
185             my_strcopy(newString._pStr, _pStr);
186             my_strcat(newString._pStr, s._pStr);
187         }
188         return newString;
189     }
190     size_t Size()const      //返回字符串的大小
191     {
192         return *(size_t*)_pStr;
193     }
194     bool Empty()const        //当前字符串是否为空
195     {
196         return *_pStr == NULL;
197     }

  C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如str<”hello”)。在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时,string (“aaaa”) <string(aaaaa)。另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0-相等〉0-大于<0-小于。

198     bool operator>(const String &s)const   /
199     {
200         return (my_strcmp(_pStr, s._pStr) > 0);
201     }
202     bool operator<(const String& s)const
203     {
204         return (my_strcmp(_pStr, s._pStr) < 0);
205     }
206     bool operator==(const String& s)const
207     {
208         return (my_strcmp(_pStr, s._pStr) == 0);
209     }
210     bool operator!=(const String& s)const
211     {
212         return (my_strcmp(_pStr, s._pStr) != 0);
213     }
214 
215 private:
216     int& GetCount()    //计数
217             {
218                 return *((int*)_pStr - 1);
219             }
220             void Release()  
221             {
222                 if (_pStr && (0 == --GetCount()))
223                 {
224                     _pStr = (char*)((int*)_pStr - 1);
225                     delete _pStr;
226                 }
227             }
228     char *_pStr;
229 };
String类中有很多函数,上面只实现了大部分常用的
下面是只测试了一部分的结果
1 int main()
 2     {
 3         String s1;
 4         String s2 = "abc";
 5         cout << "s2为:" << s2 << endl;
 6         String s3(s2);
 7         cout << "s3为:" << s3 << endl;
 8         String s4 = "def";
 9         cout << "s4为:" << s4 << endl;
10         s2[0] = '5';
11         cout << "s2为:" << s2 << endl;
12         String s5 = s2 + s4;
13         cout << "s5为:" << s5 << endl;
14         getchar();
15         return 0;
16     }

 

posted @ 2017-04-04 13:27  滴巴戈  阅读(526)  评论(0编辑  收藏  举报