字符串类(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(使用前将#替换为@)