#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 类的实现(3)String类常用函数的更多相关文章

  1. Java常用类之String类、Stringbuffer和Random类练习

    定义一个StringBuffer类对象, 1)使用append方法向对象中添加26个字母,并倒序遍历输入 2)删除前五个字符 package 第十一章常用类; /** * 定义一个StringBuff ...

  2. Java常用类(一)String类详解

    前言 在我们开发中经常会用到很多的常用的工具类,这里做一个总结.他们有很多的方法都是我们经常要用到的.所以我们一定要把它好好的掌握起来! 一.String简介 1.1.String(字符串常量)概述 ...

  3. Java常用类(二)String类详解

    前言 在我们开发中经常会用到很多的常用的工具类,这里做一个总结.他们有很多的方法都是我们经常要用到的.所以我们一定要把它好好的掌握起来! 一.String简介 1.1.String(字符串常量)概述 ...

  4. C++string类常用函数

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

  5. 01 语言基础+高级:1-3 常用API第一部分_day08【String类、static、Arrays类、Math类】

    day08[String类.static.Arrays类.Math类] String类static关键字Arrays类Math类 教学目标能够使用String类的构造方法创建字符串对象能够明确Stri ...

  6. java常用类,包装类,String类的理解和创建对象以及StringBuilder和StringBuffer之间的区别联系

    一.包装类的分类: 1.黄色部分的父类为Number 继承关系: Boolean Character 其他六个基本数据类型 2.装箱和拆箱 理解:一个例子,其他的都相同 装箱:Integer inte ...

  7. JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类

    字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...

  8. Java中的常用类:包装类、String、StringBuffer、StringBuilder、Math、System、Arrays、BigInteger、BigDecimal、Data、Calendar

    一.包装类 √ 二.String类 ★ 三.StringBuffer和StringBuilder类 ★ 四.Math类 五.System类 六.Arrays类 七.BigInteger类和BigDec ...

  9. 9、Java 常用类 Math,Number子类,String,Character

    本小节主要介绍一些如何去使用Java提供的类如何去使用?如何在实战中使用?从来没有用过的如何去学习? 分享一下发哥的学习方法? 1.针对性的学习 在理解自己的需求或者要做某一块的内容后,有针对性,选择 ...

  10. Java 中 常用API概述之 Math, Object, String,StringBuffer类,Arrays,Integer类

    Math Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数. 与StrictMath类的一些数字方法不同,Math类的StrictMath所有Math都没有定义为返回比特位相同 ...

随机推荐

  1. linux中管理包的apt和dpkg命令用法

    1,apt-get命令 apt-get是debian,ubuntu发行版的包管理工具,与红帽中的yum工具非常类似,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸 ...

  2. Shell-find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz

    查找所有的 jpg 文件,并且压缩它们: find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz

  3. k64 datasheet学习笔记4---Clock distribution

    1.前言 本文主要讲述K64时钟配置相关的内容. 2.clock overview 2.1 clock diagram 2.2 对clock diagram的信号说明 (1)MCG决定哪个clock ...

  4. 升级Jenkins版本

    找到jenkins.war文件的安装目录 cd /usr/local/tomcat/tomcat1_jenkins/webapps/ 停止jenkins service tomcat_jenkins ...

  5. Node.js的单元测试框架初体验

    Mocha是一个功能丰富的JavaScript测试框架,运行在node.js平台和浏览器端,使异步测试变得简单和有趣.Mocha测试是串行的,允许灵活和准确的报告,同时将未捕获的异常映射到相应的测试用 ...

  6. delphi 控件集

    delphi  控件集: 1)RAIZE 控件包  :http://www.raize.com/devtools/rzcomps/   被收购 Raize Components has been ac ...

  7. AIX系统下sed的用法与实例——查询/打印/替换字符串并生成文件/删除

    sed是AIX中非常重要的文本流编辑器,它对输入的文本进行查询/打印/替换/删除等操作,并将结果写到标准输出.sed 命令包含很多功能,用于选择要修改的行,并只对选择的行作更改. 首先,使用sed命令 ...

  8. ubuntu16.04彻底删除nginx+php

    1.1 删除nginx,–purge包括配置文件 sudo apt-get --purge remove nginx 1.2 自动移除全部不使用的软件包 sudo apt-get autoremove ...

  9. 装机uefi问题

    1 uefi不支持普通winpe启动,需要改为legacy 2 七代酷睿不支持win10以下版本 3 装机后无法启动是因为隐藏分区问题,删除掉,最好整个硬盘格式化 4 老毛桃一键装机不可以时,改为虚拟 ...

  10. <TCP/IP>地址解析协议ARP

    从前两章中有学到,网络层地址和链路层地址是由不同的,一个是物理地址,一个是IP地址.物理地址固定存储在网卡中,不会改变,而IP地址是可以网络管理员和用户自己分配的 在传统的IPv4网络中,一台A主机要 ...