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 }