MyString(字符串类)实现

2023-05-16

字符串类(MyString)说明文档

一、MyString类的组成

1.1 私有成员

char* data    字符型指针

int length     整型字符串长度

1.2 共有成员

1.2.1 构造与析构函数

MyString()    默认构造

MyString(const int intNum整数构造

MyString(const float floatNum浮点数构造

MyString(const char* pStr一般构造

MyString(const int* pStr)   整型buffer构造

MyString(const MyString& rhs)   复制构造

~MyString()   析构函数

1.2.2 运算符重载函数

MyString& operator=(const MyString& rhs重载=运算符
MyString& operator=(const char* str)   重载=运算符

friend MyString operator+(const MyString& rhs1, const MyString &rhs2) 重载+运算符

friend MyString operator-(const MyString& rhs1, const MyString& rhs2) 重载-运算符

friend MyString& operator+=(MyString& rhs1, const MyString& rhs2)     重载+=运算符

friend MyString& operator-=(MyString& rhs1, const MyString& rhs2)     重载-=运算符

friend ostream& operator<<(ostream& os, const MyString& rhs)          重载<<运算符

friend istream& operator>>(istream& is, MyString& rhs)                重载>>运算符

1.2.3 其他成员函数

void setData(char* Data) 为MyString对象的data成员赋值

void setLength(int Length)      为MyString对象的length成员赋值

char* getData()   获取MyString对象的data

int getLength()   获取MyString对象的length

char* subString(int m, int n)   返回MyString对象的m开始的n个字符

int find(const MyString& string_s) const                              返回string_s在MyString对象中的首位置

int toint()   将MyString对象的数值串转换为对应的整数

int tofloat()     将MyString对象的数值串转换为对应的浮点数

bool isEmpty()    检验MyString对象的data成员是否为空

二、MyString类的功能

2.1 接受多种类型的数据构造MyString对象

2.1.1 字符指针构造:

传入char*类型的值进行MyString对象构造,对象的data保存char*所指向的字符串内容,length保存char*所指向的字符串长度。参数接受指定的常字符串或某一字符指针。

eg:

MyString str1("TJDXHDL");

char* temp = new char[6];

MyString str7(temp);

2.1.2 整型buffer构造:

传入int*类型的值进行MyString对象构造,对象的data保存将int*所指向的以整型0结尾的整型数组内容去除末位0后转化为的对应数字字符,length保存int*所指向的除末位0以外的数组长度。参数接受指定的某一整型指针。

eg:

int buffer[8] = {1,2,3,4,5,6,7,0};

MyString temp2(buffer);

2.1.3 整型构造:

传入int类型的值进行MyString对象构造,构造函数中先将整型值转换为字符串,对象的data保存该字符串内容,length保存该字符串长度。正数负数皆可接受。

eg:

MyString str2(123);

MyString str4(-123);

2.1.4 浮点型构造:

传入float类型的值进行MyString对象构造,构造函数中先将浮点型值转换为字符串,对象的data保存该字符串内容,length保存该字符串长度。正数负数均可接受。目前浮点型值在构造转换时精度仅保留一位小数,保留的具体位数可在代码中通过修改参数进行调整,但是由于浮点型自身精度的问题,可能出现转换不准确的情况。

eg:

MyString str3(123.0f);

MyString str5(-123.0f);

2.1.5 复制构造:

传入MyString类型的值进行MyString对象复制构造,构造函数中将传入对象的data保存至被构造对象的data中,将传入对象的length保存至被构造对象的length中。

eg:
MyString str6(str1);

2.2 MyString对象进行多种运算操作

2.2.1 “=”运算

重载”=”运算符,传入char*或MyString类型的值将其传递给等号左边MyString对象的data中,将传入字符串的长度传递给等号左边MyString对象的length中。

eg:

MyString str8("");

str8 = str1;

char* temp = new char[6];

str8 = temp;

2.2.2 “+”运算

重载”+”运算符,符号两侧传入MyString对象进行加法运算,将运算结果传递给新构造的MyString对象的data中,将运算结果的长度传递给新构造的MyString对象的length中。

eg:

str2 = str1 + str2;

str2 = str2 + 123;

str2 = str2 + 123.0f;

str2 = str2 + "HDL";

2.2.3 “-”运算

重载”-”运算符,符号两侧传入MyString对象进行减法运算,将运算结果传递给新构造的MyString对象的data中,将运算结果的长度传递给新构造的MyString对象的length中。其能够删除被减字符串中所有与减字符串匹配的子串。若被减字符串的长度小于减字符串的长度,则打印Error信息。

eg:

str2 = str1 - str2;

str2 = str2 - 123;

str2 = str2 - 123.0f;

str2 = str2 - "HDL";

2.2.4 “+=”运算

重载”+=”运算符,符号两侧传入MyString对象进行加法运算,将运算结果传递给符号左侧的MyString对象的data中,将运算结果的长度传递给符号左侧的MyString对象的length中。

eg:

str4 += "HDL";

str4 += 123;

str4 += 123.0f;

str4 += str2;

2.2.5 “-=”运算

重载”-=”运算符,符号两侧传入MyString对象进行减法运算,将运算结果传递给符号左侧的MyString对象的data中,将运算结果的长度传递给符号左侧的MyString对象的length中。其能够删除被减字符串中所有与减字符串匹配的子串。若被减字符串的长度小于减字符串的长度,则打印Error信息。

eg:
str4 -= "HDL";

str4 -= 123;

str4 -= 123.0f;

str4 -= str2;

2.2.6 “>>”运算

重载”>>”运算符,将由键盘输入的字符串传递给一个MyString对象的data中,将字符串的长度传递给该MyString对象的length。

eg:

cin >> str1;

2.2.7 “<<”运算

重载”<<”运算符,将一个MyString对象的data字符串内容打印出来。

eg:

cout << str1 << endl;

2.3 MyString对象进行查找、转换等操作

2.3.1 返回子串

提供subString(m, n)方法,该方法能够返回该MyString对象的data中由第m位开始的长度为n的子串(位置编号由0开始),并打印输出。若m不在该字符串的长度范围内,或n为小于0的数,将打印Error信息;若目标子串长度大于字符串由位置m开始的字串长度,将打印Warning信息。

eg:

str1.subString(4, 3);

2.3.2 查找子串

提供find(string_s)方法,该方法能够返回该MyString对象的data中与MyString对象string_s的data中字符串匹配的第一个子串的首地址。若原字符串长度为0,或原字符串长度小于string_s字符串,将打印Error信息;若string_s字符串的长度为0,将答应Warning信息。

eg:

int position = str6.find(str1);

2.3.3 字符串转整数

提供toint()方法,该方法能够将该MyString对象的data转换为对应的整数并打印输出。该方法要求MyString对象中data存储的字符串能显示得读为整数,否则将打印Error信息。

eg:

str2.toint();

2.3.4 字符串转浮点数

提供tofloat()方法,该方法能够将该MyString对象的data转换为对应的浮点数并打印输出。目前转换结果仅保留一位小数。该方法要求MyString对象中data存储的字符串能显示得读为浮点数,否则将打印Error信息。

eg:

str3.tofloat();

三、MyString类的使用

3.1 使用说明

MyString类的测试代码以x86版本进行编译,用户使用时请参照前两节的内容创建您自己的对象并调用相应的方法实现您所需的功能。MyString类提供的接口支持包括char*、int、float、MyString等多种类型参数的操作,其中的int与float类型支持包含正数、负数的各种形式。MyString类提供了setData()和setLength()的方法供用户在特殊情况下直接对对象的存储内容进行修改,但是此行为不被提倡,容易造成对象的data成员和length成员不匹配的情况。MyString类目前存在的主要问题在于受限于float类型值的精度,无法实现浮点型数值在于字符串之间的多位小数准确转换,该问题有待于后续版本继续完善。

MyString类目前提供源文件的.cpp和.h文件供用户使用,下一步将在https://github.com/TJHDL/MyString2021进行开源,该项目遵循MIT协议,欢迎用户通过实践提出宝贵的意见和建议,以激励本项目继续进行bug的修复和改进。

3.2 使用示例

本节提供对MyString类进行测试的main.cpp程序作为使用示例,所涉及的操作情况并不完全,用户可基于该程序进行自己的开发,并且对MyString类尝试更加丰富的操作。

main.cpp:

#include <iostream>

#include <MyString.h>

using namespace std;

int main()

{

    MyString str1("TJDXHDL");

    MyString str2(123);

    MyString str3(123.0f);

    MyString str4(-123);

    MyString str5(-123.0f);

    MyString str6(str1);

    str2 = str2 + 123;

    str4 += 123.0f;

    str3 = str3 - 23;

    str5 -= -12;

    str1.subString(4, 3);

    int position = str6.find(str1);

    cout << "The position of str1 in str6 is: " << position << endl;

    str2.toint();

    str3.tofloat();

    str6.isEmpty();

    str1.getData();

    str1.getLength();

    str2.getData();

    str2.getLength();

    str3.getData();

    str3.getLength();

    str4.getData();

    str4.getLength();

    str5.getData();

    str5.getLength();

    str6.getData();

    str6.getLength();

    return 0;

}

示例结果:

 

3.3 警告、报错说明

本节将对用户使用过程中遇到的各种警告或报错情况进行说明,警告和报错的存在旨在提醒您如何安全、正确得使用MyString类。

Warning:

case1: 用户企图手动修改MyString对象。

Warning: It is an irregular method!

case2: 用户传递给subString()方法中的参数n长于MyString对象的字符串从位置m开始到结束的子串长度。

Warning: The n is too long, so return the substring after m!

case3: 用户调用find()方法时要找的子串为空,长度为0。

Warning: The shorter string is NULL!

Error:

case1: 减法运算中被减字符串长度小于减字符串长度。

Error: The length of No.1 string is shorter than the No.2!

case2: 用户企图手动赋给MyString对象的length成员负数。

Error: An invalid length was assigned to the variable 'length'!

case3: 用户传递给subString()方法中的参数m表示的位置小于0或超出MyString对象的字符串长度。

Error: The position m isn't in the string!

case4: 用户传递给subString()方法中的参数n表示的长度小于0。

Error: The n is an invalid number!

case5: 用户调用find()方法的MyString对象字符串长度为0。

Error: The longer string is NULL!

case6: 用户调用find()方法的MyString对象字符串长度小于要找的子串。

Error: The No.2 string is longer than the No.1!

case7: 用户企图通过toint()方法将不可显式读为整数的字符串转变为整型。

Error: This string isn't an int number, so it can't been transformed to type int!

case8: 用户企图通过tofloat()方法将不可显式读为浮点数的字符串转变为浮点型。

Error: This string isn't a float number, so it can't been transformed to type float!

case9: 用户企图将长度超过1024的整型数组转化为MyString对象造成溢出。

Error: The buffer overflows the max length!

3.4 指定样例测试结果

本节以题目提供的测试程序对MyString类进行测试,并展示对应的测试结果。

main.cpp:

#include <iostream>

#include <MyString.h>

using namespace std;

int main()

{

   

    int buffer[8] = {1,2,3,4,5,6,7,0};

    int m = 1, n = 2;

    MyString temp;

    MyString temp1(567);//字符串内部存“567”

    MyString temp2(buffer);//把以0结尾的buffer转换成MyString

    MyString temp3(temp2);

    temp = temp + temp1;

    temp += 23.0f;//给字符串后面增加字母“23.0”,保留小数后面1位小数。

    temp += 23;

    temp -= 23;//把字符串中的“23”子串删除

    temp -= "23";//把字符串中的“23”子串删除

    temp.subString(m, n);//返回从m开始的n个字母;

    temp2.find(temp1);//返回temp2子串在temp中的位置。-1表示没有找到

    temp.toint();//数值串转换成整数,-2表示失败,无法转换;

    temp.tofloat();//数值串转换成浮点数,-2表示失败,无法转换;

    cout << temp << endl;//输出字符串到屏幕

    cout << temp.getLength() << endl;//输出字符串长度到屏幕

    return 0;

}

测试结果:

 

完整代码及报告可参考github:GitHub - TJHDL/MyString2021

#pragma once
#include <iostream>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;

class MyString {
private:
    char* data;
    int length;    //  Don't include '\0'.

public:
    //  Constructors and destructors.
    MyString();
    MyString(const int intNum);
    MyString(const float floatNum);
    MyString(const char* pStr);
    MyString(const int* pStr);
    MyString(const MyString& rhs);
    ~MyString();

    //  Operator overloading.
    MyString& operator=(const MyString& rhs);
    MyString& operator=(const char* str);
    friend MyString operator+(const MyString& rhs1, const MyString &rhs2);
    friend MyString operator-(const MyString& rhs1, const MyString& rhs2);
    friend MyString& operator+=(MyString& rhs1, const MyString& rhs2);
    friend MyString& operator-=(MyString& rhs1, const MyString& rhs2);
    friend ostream& operator<<(ostream& os, const MyString& rhs);
    friend istream& operator>>(istream& is, MyString& rhs);
    
    //  Other member functions.
    void setData(char* Data);
    void setLength(int Length);
    char* getData();
    int getLength();
    char* subString(int m, int n);
    int find(const MyString& string_s) const;
    int toint();
    int tofloat();
    bool isEmpty();
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyString(字符串类)实现 的相关文章

  • 第16章 变更管理

    文章目录 16 1 项目变更的基本概念16 1 1 项目变更的含义16 1 2 项目变更的分类16 1 3 项目变更产生的原因 16 2 变更管理的基本原则16 3 变更管理角色职责与工作程序16 3 1 角色职责16 3 2 工作程序 1
  • 第17章 信息系统安全管理

    文章目录 信息安全属性及目标 xff08 1 xff09 保密性 xff08 Confidentiality xff09 xff08 2 xff09 完整性 xff08 Integrity xff09 xff08 3 xff09 可用性 x
  • 第18章 项目风险管理

    文章目录 18 1 2 风险的分类按照性质划分 xff08 纯粹 投机 xff09 按照产生原因 xff08 自然 社会 政治 经济 技术 xff09 18 1 3 风险的性质 xff08 客观 偶然 相对 社会 不确定 xff09 项目风
  • 第19章 项目收尾管理

    文章目录 19 1 项目验收 xff08 1 xff09 验收测试 xff08 2 xff09 系统试运行 xff08 3 xff09 系统文档验收 xff08 4 xff09 项目终验 19 2 项目总结 xff08 属于项目收尾的 管理
  • 第20章 知识产权管理、第21章 法律法规和标准规范

    文章目录 20 1 2 知识产权的特性 58420 2 1 著作权及邻接权 58520 2 2 专利权 58920 2 3 商标权 59221 3 诉讼时效 59921 6 3 标准分级与标准类型 60321 7 2 信息系统集成项目管理常
  • 系统集成项目管理工程师 下午 真题 及考点(2022年四套卷)

    文章目录 2022年下半年试题一 xff1a 第10章 项目质量管理 xff0c 流程图 核查表 帕累托图 xff0c 7种质量工具 xff0c 一致性成本和非一致性成本 xff0c 质量保证和质量控制试题二 xff1a 第8章 项目进度管
  • 系统集成项目管理工程师 下午 真题 及考点(2021年上下半年)

    文章目录 2021年下半年试题一 xff1a 第18章 项目风险管理 xff0c 风险应对策略 xff0c 风险的性质 xff08 客观 偶然 相对 社会 不确定 xff09 试题二 xff1a 第9章 项目成本管理 xff0c 执行绩效
  • 系统集成项目管理工程师 下午 真题 及考点(2020年下半年)

    文章目录 2020年下半年试题一 xff1a 第10章 项目质量管理 xff0c 规划质量管理过程的输入试题二 xff1a 第9章 项目成本管理 xff0c 典型 xff1a EAC 61 AC 43 ETC 61 AC 43 xff08
  • FreeSWITCH之lua脚本事件订阅

    目录 相关接口简要说明 Even EventConsumer pop获取事件 bind订阅 代码示例 事件创建 事件订阅 FreeSWITCH中通过订阅事件 xff0c 我们能获取到各种实时信息 xff0c 进而可以对通话进行精确的控制 在
  • 超级基础A*寻路教程

    download code resource 学习了一下A 算法 xff0c 但是天生对算法无奈 xff0c 还好一不小心找到下面这篇文章 如果你苦于无法理解网上各大牛人的巅峰讨论以及他们火星文般的源代码 xff0c 那么这篇文章实在是太适
  • Cannot find module ‘body-parser‘

    node modules下模块缺失 解决方案 xff1a npm install span class token operator span save body span class token operator span parser
  • C#中struct和class的区别

    本文详细分析了C 中struct和class的区别 xff0c 对于C 初学者来说是有必要加以了解并掌握的 简单来说 xff0c struct是值类型 xff0c 创建一个struct类型的实例被分配在栈上 class是引用类型 xff0c
  • 沁恒MCU串口使用指南

    转载注明出处 沁恒MCU串口使用指南 xff1a 适用于WCH的32位MCU和CH559 558单片机 只描述TTL电平的TX 43 RX形式的常规串口 xff0c 流控 xff0c RS232 RS485不在文章涉及范围之内 大部分8位机
  • ubuntu安装网络调试助手

    下载mNetAssist安装包 链接 https pan baidu com s 1eHalZSnsVKXRERmIOCfj0w 提取码 bhxs新建终端并切换到安装包所在目录sudo dpkg i mNetAssist release a
  • .s19 文件转换为 .hex 和 .bin文件的方法

    使用STVD开发时 xff0c 编译后产生的是 s19 文件 xff0c 与Keil 和 IAR常见的 hex bin文件不同 xff0c 那么如何将 s19文件转换为常见的文件格式呢 xff1f 一 获取工具 burner 下载链接 xf
  • VS Code中C/C++ 无法跳转到定义的解决办法

    VS code的跳转功能一直很迷 xff0c 时好时坏 xff0c 有些新的工程环境干脆用不了 经过一遍遍的baidu加上自己的摸索 xff0c 总结出一套经验 xff0c 应该可以解决大部分的情况了 一 首先 xff0c 当然是安装插件了
  • 使用void*强转函数指针(编辑中)

    别把函数名当成函数 xff0c just a 变量 typedef void AirCb void 空回调函数 typedef int aimFunction int para1 char para2 int para3 要传递的目标函数
  • KoroFileHeader 配置

    一 安装插件 二 Github 地址 https github com OBKoro1 koro1FileHeader 三 快速上手 https github com OBKoro1 koro1FileHeader wiki E5 AE 8
  • 网络接入与身份认证简介

    目录 1 认证简介 2 常见认证机制 基于口令的身份认证机制 挑战 响应认证机制 EAP认证机制 3 公钥认证机制 4 使用认证机制的认证协议 RADIUS认证协议 TACACS 43 认证协议 Kerberos认证协议 LDAP协议 5
  • VS Code常见问题

    1 更改自动补全 xff08 联想 xff09 快捷键的方法 文件 gt 首选项 gt 键盘快捷方式 搜索trigger 找到该选项 xff0c 更改快捷键 2 当鼠标悬停在枚举值上 xff0c 不能显示当前序号 a 打开setting j

随机推荐