• 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 != '')
     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 == '')
     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 != '')
     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 == '')
     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 = '';
     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     }

  • 相关阅读:
    二、缴费证明(完税凭证)开具渠道
    DateTime的具体用法
    获取HTML页面高度和分辨率
    JS获取当前日期及时间
    CSS textindent 属性
    combotree初始化加载折叠
    关于C#中将数字转换为指定格式
    jquery cookie用法(获取cookie值,删除cookie)
    如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录。
    定位/定位偏移量
  • 原文地址:https://www.cnblogs.com/33debug/p/6664753.html
Copyright © 2020-2023  润新知