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

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

  1. friend ostream& operator<<(ostream& output, const String& s)
  2. {
  3. output << s._pStr;
  4. return output;
  5. }
  6. friend istream &operator >> (istream &input, String &s)
  7. {
  8. char temp[];
  9. input >> setw() >> temp;
  10. s = temp;
  11. return input;
  12. }
  13. bool StrStr(const String& s)
  14. {
  15. String newString;
  16. if (!s._pStr)
  17. newString = *this;
  18. else if (!_pStr)
  19. newString = s;
  20. char* ret = my_strstr(_pStr, s._pStr);
  21. if (ret != NULL)
  22. return true;
  23. else
  24. return false;
  25. }
  26.  
  27. String operator+(const String &s)const //把字符串s连接到当前字符串的结尾 同C-sring中的石strcat()函数;
  28. {
  29. String newString;
  30. if (!s._pStr)
  31. newString = *this;
  32. else if (!_pStr)
  33. newString = s;
  34. else
  35. {
  36. newString._pStr = new char[my_strlen(_pStr) + my_strlen(s._pStr) + ];
  37. my_strcopy(newString._pStr, _pStr);
  38. my_strcat(newString._pStr, s._pStr);
  39. }
  40. return newString;
  41. }
  42. size_t Size()const //返回字符串的大小
  43. {
  44. return *(size_t*)_pStr;
  45. }
  46. bool Empty()const //当前字符串是否为空
  47. {
  48. return *_pStr == NULL;
  49. }

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

  1. bool operator>(const String &s)const /
  2. {
  3. return (my_strcmp(_pStr, s._pStr) > );
  4. }
  5. bool operator<(const String& s)const
  6. {
  7. return (my_strcmp(_pStr, s._pStr) < );
  8. }
  9. bool operator==(const String& s)const
  10. {
  11. return (my_strcmp(_pStr, s._pStr) == );
  12. }
  13. bool operator!=(const String& s)const
  14. {
  15. return (my_strcmp(_pStr, s._pStr) != );
  16. }
  17.  
  18. private:
  19. int& GetCount() //计数
  20. {
  21. return *((int*)_pStr - );
  22. }
  23. void Release()
  24. {
  25. if (_pStr && ( == --GetCount()))
  26. {
  27. _pStr = (char*)((int*)_pStr - );
  28. delete _pStr;
  29. }
  30. }
  31. char *_pStr;
  32. };
  1. String类中有很多函数,上面只实现了大部分常用的
  1. 下面是只测试了一部分的结果
  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[] = '';
  11. cout << "s2为:" << s2 << endl;
  12. String s5 = s2 + s4;
  13. cout << "s5为:" << s5 << endl;
  14. getchar();
  15. return ;
  16. }

String 类的实现(5)String常用函数的更多相关文章

  1. c++ string类使用及用string类解决整行字符串输入

    下面随笔给出c++ string类使用及用string类解决整行字符串输入. string类 使用字符串类string表示字符串 string实际上是对字符数组操作的封装 string类常用的构造函数 ...

  2. C++ string 类中的 assign()函数

    C++ string 类的成员函数,用于拷贝.赋值操作,它们允许我们顺次地把一个 string 对象的部分内容拷贝到另一个 string 对象上. 函数原型 string &operator= ...

  3. String类的四个默认成员函数

    优化版的拷贝构造函数,先创建一个暂时实例tmp,接着把tmp._ptr和this->_ptr交换,因为tmp是一个局部变量.程序执行到该函数作用域外,就会自己主动调用析构函数.释放tmp._pt ...

  4. String类比较,String类运算比较,String运算

    String类比较,String类运算比较 >>>>>>>>>>>>>>>>>>>&g ...

  5. C++string类常用函数

    C++string类常用函数 string类的构造函数:string(const char *s);    //用c字符串s初始化string(int n,char c);     //用n个字符c初 ...

  6. 【STL】string 常用函数

    string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造 ...

  7. 【转】string常用函数

    原文地址:http://hi.baidu.com/baowup/blog/item/3a27465c86d71546faf2c066.html/cmtid/de1ef3f0de7554a0a40f52 ...

  8. C++ string类及其函数的讲解

    文章来源于:http://www.cnblogs.com/hailexuexi/archive/2012/02/01/2334183.html C++中string是标准库中一种容器,相当于保存元素类 ...

  9. stl string常用函数

    string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造 ...

  10. C++中的string常用函数用法

    标准c++中string类函数介绍   注意不是CString 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而 ...

随机推荐

  1. JS判断客户端、浏览器、操作系统

    一.JS判断客户端是否是iOS或者Android手机移动端 通过判断浏览器的userAgent,用正则来判断手机是否是ios和Android客户端. 方法一: var u = navigator.us ...

  2. 配置FindBugs和常见FindBugs错误

    配置FindBugs: 在这里可以对FindBugs规则等进行详细设置. 选择你的项目,右键 => Properties => FindBugs => 1 Run Automatic ...

  3. JavaScript 基本类型值-Undefined、Null、Boolean

    ▓▓▓▓▓▓ 大致介绍 ECMAScript中有5中简单的数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String. ▓▓▓▓▓▓ Undefined ...

  4. UE4从零搭建CF游戏关卡(蓝图篇)

    一 往关卡中放置物体 二 Static Mesh 和 BSP 从今天开始我们要建立一个类似CF游戏的场景,不写一句代码,纯蓝图实现. 三 英语学习 今天早上开会,经理说了一件让我震惊的事情,她说最近大 ...

  5. FineUIMvc随笔(4)自定义回发参数与自定义回发

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 不能忘却的回发 在上一篇文章中,我们对FineUIMvc中的回发进行了详细描述,目的是为了告诉大家: 1. FineUIMvc中 ...

  6. Python拉勾爬虫——以深圳地区数据分析师为例

    拉勾因其结构化的数据比较多因此过去常常被爬,所以在其多次改版之下变得难爬.不过只要清楚它的原理,依然比较好爬.其机制主要就是AJAX异步加载JSON数据,所以至少在搜索页面里翻页url不会变化,而且数 ...

  7. java 限定控制台输入值的类型

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...

  8. 关于IE低版本兼容问题

    1,元素浮动之后,能设置宽度的话就给元素加宽度.如果需要宽度是内容撑开,就给它里边的块元素加上浮动: 解决方案:给需要宽度由内容撑开的元素加上浮动 css样式: <style> .box{ ...

  9. 1787: [Ahoi2008]Meet 紧急集合

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1482  Solved: 652[Submit][ ...

  10. spring mvc中的拦截器小结 .

    在spring mvc中,拦截器其实比较简单了,下面简单小结并demo下. preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Control ...