#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. Gulp自动构建Web前端程序

    这两天在一个朋友在项目上碰到了一个这样的问题,在运营过程中,用户在浏览器上对某个表单进行数据提交时,需要引入新的平台接口数据的业务,通过评估,开发团队马上修改了相关后台代码和部分的前端脚本代码,通过简 ...

  2. 购物篮模型&Apriori算法

    一.频繁项集 若I是一个项集,I的支持度指包含I的购物篮数目,若I的支持度>=S,则称I是频繁项集.其中,S是支持度阈值. 1.应用 "尿布和啤酒" 关联概念:寻找多篇文章中 ...

  3. HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(二)

    HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一) 下面来查看其他对保存HSTS信息的enabled_sts_hosts ...

  4. HTTP和HTTPS协议

    网络协议为计算机网络中进行数据交换而建立的规则.标准或约定的集合. URL:就是网址.http://www.hcios.com/archives/1547 URL就是资源的地址,位置.互联网上的每一个 ...

  5. 每天一个linux命令(41)--ping命令

    Linux系统的 ping 命令是常用的网络命令,它通常用来测试与目标主机的连通性,它通过发送 ICMP ECHO_REQUEST数据包到网络主机(send  ICMP  ECHO_REQUEST t ...

  6. 【Zookeeper】源码分析之网络通信(三)

    一.前言 前面已经学习了NIOServerCnxn,接着继续学习NettyServerCnxn. 二.NettyServerCnxn源码分析 2.1 类的继承关系 public class Netty ...

  7. Android网络编程要学的东西与Http协议学习

    本节引言: 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程是要干嘛?http协议的学习,使用自带扣脚Json解析类解析Json,XML解析常用的几种方式,HttpUr ...

  8. Kindle电子阅读器收不到个人文档推送解决方案

    最近我的 kindle 固件版本更新到 5.8.7.0.1 ,发现增加了生字注音功能,瞬间变成小学生阅读神器有木有,不过,这个功能可以隐藏.显示,看着碍眼隐藏即可,还可以减少和增加生字注音.感觉对于经 ...

  9. Digital Tutors - Creating an Action Adventure Puzzle in Unity学习笔记

    遇到的问题: 1 第11节Scripting the pressure plates中需要获取子物体的Animator组件,教程使用的语句如下: ”SwitchAnim = GetComponentI ...

  10. Asp.Net Core Authentication Middleware And Generate Token

    .mytitle { background: #2B6695; color: white; font-family: "微软雅黑", "宋体", "黑 ...