#include<iostream>
#include<stdio.h>
#include<assert.h>
#include <iomanip>
using namespace std;
//自己模拟实现的部分相关C——string库函数
int my_strlen(const char *p)
{
int count = ;
assert(p);
while (*p != '\0')
{
p++;
count++;
}
return count;
}
char* my_strcopy(char* dest, const char* str)
{
assert(dest != NULL);
assert(str != NULL);
char* ret = dest;
while (*dest++ = *str++)
{
;
}
return ret;
}
int my_strcmp(const char *str1, const char *str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
return ;
else
{
str1++;
str2++;
}
}
return (*str1 - *str2);
}
char *my_strcat(char *dst, const char *str)
{
char *ret = dst;
assert(dst != NULL);
assert(str != NULL);
while (*dst != '\0')
{
dst++;
}
while (*dst++ = *str++)
{
;
}
return ret;
}
char *my_strstr(const char *str, const char *substr)
{
const char *str1 = NULL;
const char *str2 = NULL;
const char *start = str;
assert(str);
assert(substr);
if (*substr == NULL)
{
return (char *)str;
}
while (*start)
{
str1 = start;
str2 = substr;
while ((*str1) && (*str2) && (*str1 == *str2))
{
str1++;
str2++;
}
if (*str2 == '\0')
{
return (char *)start;
}
start++;
}
return NULL;
} class String
{
public:
String(const char *pStr = "") //string类的构造函数
{
if (pStr == NULL)
{
_pStr = new char[];
*_pStr = '\0';
}
else
{
_pStr = new char[my_strlen(pStr) + ];
my_strcopy(_pStr, pStr);
}
} String(const String& s) //拷贝构造函数
:_pStr(new char[my_strlen(s._pStr)] + )
{
if (this != &s)
{
my_strcopy(_pStr, s._pStr);
}
} ~String() //析构函数
{
if (_pStr)
delete[] _pStr;
_pStr = NULL;
} String& operator=(const String& s) 赋值运算符重载
{
if (this != &s)
{
char *temp = new char[my_strlen(s._pStr) + ];
my_strcopy(temp, s._pStr);
delete[] _pStr;
_pStr = temp;
}
return *this;
} char& operator[](size_t index)
{
if (GetCount() > )
{
char* pTem = new char[my_strlen(_pStr) + + ];
my_strcopy(pTem + , _pStr);
--GetCount();
_pStr = pTem + ;
GetCount() = ;
}
return _pStr[index];
}
const char& operator[](size_t index)const
{
return _pStr[index];
}

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

     friend ostream& operator<<(ostream& output, const String& s)
{
output << s._pStr;
return output;
}
friend istream &operator >> (istream &input, String &s)
{
char temp[];
input >> setw() >> temp;
s = temp;
return input;
}
bool StrStr(const String& s)
{
String newString;
if (!s._pStr)
newString = *this;
else if (!_pStr)
newString = s;
char* ret = my_strstr(_pStr, s._pStr);
if (ret != NULL)
return true;
else
return false;
} String operator+(const String &s)const //把字符串s连接到当前字符串的结尾 同C-sring中的石strcat()函数;
{
String newString;
if (!s._pStr)
newString = *this;
else if (!_pStr)
newString = s;
else
{
newString._pStr = new char[my_strlen(_pStr) + my_strlen(s._pStr) + ];
my_strcopy(newString._pStr, _pStr);
my_strcat(newString._pStr, s._pStr);
}
return newString;
}
size_t Size()const //返回字符串的大小
{
return *(size_t*)_pStr;
}
bool Empty()const //当前字符串是否为空
{
return *_pStr == NULL;
}

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

     bool operator>(const String &s)const   /
{
return (my_strcmp(_pStr, s._pStr) > );
}
bool operator<(const String& s)const
{
return (my_strcmp(_pStr, s._pStr) < );
}
bool operator==(const String& s)const
{
return (my_strcmp(_pStr, s._pStr) == );
}
bool operator!=(const String& s)const
{
return (my_strcmp(_pStr, s._pStr) != );
} private:
int& GetCount() //计数
{
return *((int*)_pStr - );
}
void Release()
{
if (_pStr && ( == --GetCount()))
{
_pStr = (char*)((int*)_pStr - );
delete _pStr;
}
}
char *_pStr;
};
String类中有很多函数,上面只实现了大部分常用的
下面是只测试了一部分的结果
 int main()
{
String s1;
String s2 = "abc";
cout << "s2为:" << s2 << endl;
String s3(s2);
cout << "s3为:" << s3 << endl;
String s4 = "def";
cout << "s4为:" << s4 << endl;
s2[] = '';
cout << "s2为:" << s2 << endl;
String s5 = s2 + s4;
cout << "s5为:" << s5 << endl;
getchar();
return ;
}

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. 通过oledb驱动读取excel、csv数据丢失解决方案

    1.问题出现 在开发应用程序的过程中,比较常用一功能就是通过oledb驱动读取excel.csv.text等文件:而最近有客户反映,在使用短信平台(下载地址:http://www.sms1086.co ...

  2. BZOJ1115:[POI2009]石子游戏Kam (博弈论)

    挺水的 听说是阶梯nim和,就去看了一下,然后就会了= = 观察题目,发现拿第i堆棋子k个造成的影响就是第i+1堆棋子能多拿k个 可以把模型转化为,有n堆石子,每次从某一堆拿一个石子,放在下一堆中,不 ...

  3. 初探ASP.NET Web API

    什么是ASP.NET Web API? 官方的解释是 ASP.NET Web API is a framework that makes it easy to build HTTP services ...

  4. ABP Zero源码

    测试运行地址:http://ghy.demo.aspnetzero.com 账号:admin  密码:123456 需要源码,请加QQ:858-048-581 1.先编译成功,Nuget下载ABP的依 ...

  5. Hibernate框架单向多对多关联映射关系

    建立单向多对多关联关系    Project.java (项目表)                private Integer proid;                private Strin ...

  6. 2017 3-4/5 两天的学习的REVIEW

    明天就要去面试啦,去感受一下,估计又是一顿虐,蓝瘦-- 3月4日:计算机安全基础技术与原理方面的学习 密码体制(密码)由五个部分组成: 消息空间(m),密文空间(c),密钥空间(k),加密算法(E), ...

  7. forEach、map、filter、some、every五个数组方法

    forEach() 方法对数组的每一个元素执行一次提供的函数. map() 方法创建一个新数组,其结果是该数组都执行一次函数,原函数保持不变. filter() 方法使指定函数测试数组的每一个元素,并 ...

  8. KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架之koahub-skip

    koahub-skip koahub skip middleware koahub skip Conditionally skip a middleware when a condition is m ...

  9. 【Javascript】搞定JS面试——跨域问题

    什么是跨域? 为什么不能跨域? 跨域的解决方案都有哪些(解决方法/适用场景/get还是post)?  一.什么是跨域?       只要协议.域名.端口有任何一个不同,就是跨域.           ...

  10. 个人C++学习路线

    这段时间学习<<C++ primer >> 第四版,一边学一遍考虑,要怎么样往深处学习.查了网上的学习路线,知乎大神的问题回答,整理了一下思路,如下吧: <<C++ ...