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都没有定义为返回比特位相同 ...
随机推荐
- Python-集合的常用操作
#!/usr/bin/env python # -*- coding:utf- -*- # Author:Irving list_1 = [,,,,,,,] list_1 = set(list_1) ...
- layout 的应用
在XAF的开发中,详细Detail 或组合DashBoard页面,需要使用 LayoutControl 进行控件排列,下面讲述如何通过写代码进行操作. 0.DevExpress 的布局控件(DevEx ...
- 微信小程序开发记录
顶栏banner代码 /**app.wxss**/ .container { height: 100%; display: flex; flex-direction: column; align-it ...
- shell中的dd命令使用详解
一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...
- $Django Paginator分页器 批量创建数据
1批量插入数据: User_list=[]for i in range(100): User_list.append(User(name='小明%s'%i,pwd='abcdefg%s'%i))# 两 ...
- 从MySQL中导入数据到MongoDB中
从sql中导出需要的数据为csv格式的数据 select field1,field2,...,fieldn from TABLE into outfile '/test.csv' fields ter ...
- 前端 ----jQuery的属性操作
04-jQuery的属性操作 jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作 html属性操作:是对html文档中的属性进行读取,设置和移除操作.比如 ...
- js 正则提取img标签的src值
var r = '<img[^<>]*? src="([^<>]*?)"'; var yyy=content.match(r); alert(yyy[ ...
- HTML5 WebSocket 协议
1. 概述 1.1 说明 WebSocket:是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议. WebSocket原理是使用JavaScript调用浏览器的API发出一个WebSoc ...
- 【MySql】like用法
LIKE用法 SELECT * FROM TABLE WHERE col Like '%a';//检索以a结尾的内容 SELECT * FROM TABLE WHERE col Like '%a%'; ...