String 类的实现(3)String类常用函数
#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类常用函数的更多相关文章
- Java常用类之String类、Stringbuffer和Random类练习
定义一个StringBuffer类对象, 1)使用append方法向对象中添加26个字母,并倒序遍历输入 2)删除前五个字符 package 第十一章常用类; /** * 定义一个StringBuff ...
- Java常用类(一)String类详解
前言 在我们开发中经常会用到很多的常用的工具类,这里做一个总结.他们有很多的方法都是我们经常要用到的.所以我们一定要把它好好的掌握起来! 一.String简介 1.1.String(字符串常量)概述 ...
- Java常用类(二)String类详解
前言 在我们开发中经常会用到很多的常用的工具类,这里做一个总结.他们有很多的方法都是我们经常要用到的.所以我们一定要把它好好的掌握起来! 一.String简介 1.1.String(字符串常量)概述 ...
- C++string类常用函数
C++string类常用函数 string类的构造函数:string(const char *s); //用c字符串s初始化string(int n,char c); //用n个字符c初 ...
- 01 语言基础+高级:1-3 常用API第一部分_day08【String类、static、Arrays类、Math类】
day08[String类.static.Arrays类.Math类] String类static关键字Arrays类Math类 教学目标能够使用String类的构造方法创建字符串对象能够明确Stri ...
- java常用类,包装类,String类的理解和创建对象以及StringBuilder和StringBuffer之间的区别联系
一.包装类的分类: 1.黄色部分的父类为Number 继承关系: Boolean Character 其他六个基本数据类型 2.装箱和拆箱 理解:一个例子,其他的都相同 装箱:Integer inte ...
- JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类
字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...
- Java中的常用类:包装类、String、StringBuffer、StringBuilder、Math、System、Arrays、BigInteger、BigDecimal、Data、Calendar
一.包装类 √ 二.String类 ★ 三.StringBuffer和StringBuilder类 ★ 四.Math类 五.System类 六.Arrays类 七.BigInteger类和BigDec ...
- 9、Java 常用类 Math,Number子类,String,Character
本小节主要介绍一些如何去使用Java提供的类如何去使用?如何在实战中使用?从来没有用过的如何去学习? 分享一下发哥的学习方法? 1.针对性的学习 在理解自己的需求或者要做某一块的内容后,有针对性,选择 ...
- Java 中 常用API概述之 Math, Object, String,StringBuffer类,Arrays,Integer类
Math Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数. 与StrictMath类的一些数字方法不同,Math类的StrictMath所有Math都没有定义为返回比特位相同 ...
随机推荐
- POI 海量数据/大数据文件生成SXSSFWorkbook使用简介
在之前我们知道处理xls的excel用的workbook是HSSFWorkbook,处理xlsx的excel用的是XSSFWorkbook. 上面两个类导出excel的时候数据会驻留在内存中,所以当数 ...
- CF1101D GCD Counting
题目地址:CF1101D GCD Counting zz的我比赛时以为是树剖或者点分治然后果断放弃了 这道题不能顺着做,而应该从答案入手反着想 由于一个数的质因子实在太少了,因此首先找到每个点的点权的 ...
- Golang记录、计算函数执行耗时、运行时间的一个简单方法
// 写超时警告日志 通用方法 func TimeoutWarning(tag, detailed string, start time.Time, timeLimit float64) { ...
- Excel自动建组
已用于测试用例自动创建组 使用要求:A列的格式如:X.X.X.X.X11.11.1.11.1.1.11.1.1.1.11.1.1.21.1.21.22 会自动将1.1.1.1.1-1.1.1.1.X组 ...
- python性能分析之cProfile模块
cProfile是标准库内建的分析工具的其中一个,另外两个是hotshot和profile -s cumulative -s cumulative开关告诉cProfile对每个函数累计花费的时间进行排 ...
- 对比Dijakstra和优先队列式分支限界
Dijakstra和分支限界都是基于广度优先搜索,如果说两者都是生成一棵树,那Dijakstra总是找距离树根最近的(属于贪心算法),优先队列式分支限界是在层遍历整棵搜索树的同时剪去达不到最优的树枝. ...
- 设计模式C++学习笔记之九(Template Method模板方法模式)
模板模式也是相当简单的一种模式,而且是比较常用的.模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些 ...
- hibernate框架学习第四天:关联关系、外键、级联等
一对多关联关系表 一方 多方(外键)实体类 一方:TeacherModel 添加多方的集合Set 多方StudentModel 添加一方的对象一方配置关系 name:一方模型中描述多方的集合对象名 c ...
- <TCP/IP>DHCP动态主机配置协议
坚持是一种好习惯 大家都知道,为了上网我们是需要提交一些配置信息的,如IP地址,子网掩码,DNS服务器等,这些是一个主机能够在Internet上运行并给用户提供常用服务(比如web和Email)的基本 ...
- Cassandra docker 使用记录
环境介绍: docker 安装 cassandra 3.11.1 , 然后进入docker 的终端,输入 > cqlsh , 即可使用Cassandra了,详细介绍如下: 查看表空间descri ...