使用C语言实现MyString
使用C语言实现String类
注意点
- 使用了vld内存泄漏工具,没有的直接去官网下载就行,不需要的可以注释头文件引入那句
话不说多,直接上源码
MyString.h
/******************************************************************************** * * * filename : myString.h * description : * * created by mingming * ********************************************************************************/ #pragma warning(disable: 4996) #include <iostream> #include <vector> #include <string> using namespace std; class MyString { public: MyString(const char *s); MyString(const MyString &s); //拷贝构造函数 MyString(void); //不带参数的构造函数 ~MyString(void); //析构函数 MyString& operator=(const MyString &s); //=号运算符重载 MyString operator+(const MyString &s);//+号运算符重载 char operator[](int i);//[]运算符重载 bool operator<(const MyString &s);//<运算符重载 bool operator>(const MyString &s);//>运算符重载 bool operator==(const MyString &s);//==运算符重载 bool operator!=(const MyString &s);//!=运算符重载 MyString ToUpper(void); MyString ToLower(void); MyString GetStr(const int& n,const size_t& len); int FindStr(const char* str); int Length(void); int Compare(const MyString &s); MyString RemoveLRSpace(void); private: char *m_str; //友元函数 friend ostream& operator<<(ostream &out, MyString &s);//重载左移运算符 friend istream& operator >> (istream &in, MyString &s); //重载右移运算符 };
MyString.cpp
/******************************************************************************** * * * filename : myString.cpp * description : * * ********************************************************************************/ #include <iostream> #include <assert.h> #include <vld.h> #include "mystring.h" using namespace std; char *LTrim(char *str); char *RTrim(char *str); /* * @fn RTrim * @brief 去除尾部多余的空格 * @param[in] str:需要被操作的字符串 * @param[out] * @return char *:返回字符串 * * @detail * @date 2021-7-15 */ char *RTrim(char *str) { if (str == NULL || *str == '\0') { return str; } int len = strlen(str); char *p = str + len - 1; while (p >= str && isspace(*p)) { *p = '\0'; --p; } return str; } /* * @fn LTrim * @brief 去除首部多余的空格 * @param[in] str:需要被操作的字符串 * @param[out] * @return char *:返回字符串 * * @detail * @date 2021-7-15 */ char *LTrim(char *str) { if (str == NULL || *str == '\0') { return str; } int len = 0; char *p = str; while (*p != '\0' && isspace(*p)) { ++p; ++len; } memmove(str, p, strlen(str) - len + 1); return str; } /* * @fn MyString * @brief 构造函数 * @param[in] * @param[out] * @return MyString对象 * * @detail * @date 2021-7-15 */ MyString::MyString(void) { this->m_str = new char[1]; m_str[0] = '\0'; } MyString::MyString(const char *s) { if(s == NULL) { this->m_str = new char[1]; m_str[0] = '\0'; } else { m_str = new char[strlen(s) + 1]; strcpy(this->m_str, s); } } MyString::MyString(const MyString &s) { if( s.m_str == NULL) { this->m_str = new char[1]; m_str[0] = '\0'; } else { m_str = new char[strlen(s.m_str) + 1]; strcpy(this->m_str, s.m_str); } } /* * @fn 析构函数 * @brief * @param[in] * @param[out] * @return * * @detail * @date 2021-7-15 */ MyString::~MyString(void) { if (this->m_str != NULL) { delete[] this->m_str; } } /* * @fn operator+ * @brief 重载 + 操作符 * @param[in] 需要相加的MyString对象 * @param[out] * @return MyString: 返回相加结果 MyString 对象 * * @detail * @date 2021-7-15 */ MyString MyString::operator+(const MyString &s) { MyString p; delete [] p.m_str; p.m_str = new char[strlen(this->m_str) + strlen(s.m_str) + 1]; strcpy(p.m_str, this->m_str); strcat(p.m_str, s.m_str); return p; } /* * @fn operator= * @brief 重载 = 操作符 * @param[in] 源 MyString 对象 * @param[out] * @return MyString: 返回深拷贝 MyString 对象 * * @detail * @date 2021-7-15 */ MyString& MyString::operator=(const MyString &s) { int len = strlen(s.m_str) + 1; if (this == &s) { return *this; } if (this->m_str != NULL) { delete[] this->m_str; } this->m_str = new char[len]; strcpy(this->m_str, s.m_str); return *this; } /* * @fn operator[] * @brief 重载[]操作符 * @param[in] 需要相加的MyString对象 * @param[out] * @return MyString: 返回相加结果 MyString 对象 * * @detail * @date 2021-7-15 */ char MyString::operator[](int i) { int len = strlen(this->m_str) - 1; if (i > len) { return ('\0'); } else { return (this->m_str[i]); } } /* * @fn operator+ * @brief 重载+操作符 * @param[in] 需要相加的MyString对象 * @param[out] * @return MyString: 返回相加结果 MyString 对象 * * @detail * @date 2021-7-15 */ bool MyString::operator<(const MyString &s) { int ret; ret = strcmp(this->m_str, s.m_str); if (ret < 0) { return true; } else { return false; } } /* * @fn operator> * @brief 重载 > 操作符 * @param[in] s: 与当前对象计算的 MyString 对象 * @param[out] * @return true/false: 如果当前对象大于 s 返回 true;反之返回 false。 * * @detail * @date 2021-7-15 */ bool MyString::operator>(const MyString &s) { int ret; ret = strcmp(this->m_str, s.m_str); if (ret > 0) return true; else return false; } /* * @fn operator== * @brief 重载==操作符 * @param[in] s: 需要与当前对象计算的 MyString 对象 * @param[out] * @return true/false: 如果不相等返回 false;如果相等返回 true。 * * @detail * @date 2021-7-15 */ bool MyString::operator==(const MyString &s) { int ret; ret = strcmp(this->m_str, s.m_str); if (ret == 0) { return true; } else { return false; } } /* * @fn operator!= * @brief 重载 != 操作符 * @param[in] s: 需要与当前对象计算的 MyString 对象 * @param[out] * @return true/false: 如果不相等返回 true;如果相等返回false。 * * @detail * @date 2021-7-15 */ bool MyString::operator!=(const MyString &s) { int ret; ret = strcmp(this->m_str, s.m_str); if (ret != 0) { return true; } else { return false; } } /* * @fn toLower * @brief 将字符串中的大写字母变成小写 * @param[in] * @param[out] * @return myString对象 * * @detail * @date 2021-7-15 */ MyString MyString::ToLower(void) { char * temp = this->m_str; while (*temp != '\0') { if(*temp <= 'Z' && *temp >= 'A') { *temp += 32; temp++; } else { temp++; } } return *this; } /* * @fn toLower * @brief 将字符串中的小写字母变成大写 * @param[in] * @param[out] * @return myString对象 * * @detail * @date 2021-7-15 */ MyString MyString::ToUpper(void) { char * temp = this->m_str; while (*temp != '\0') { if(*temp <= 'z' && *temp >= 'a') { *temp -= 32; temp++; } else { temp++; } } return *this; } /* * @fn findStr * @brief 查找str在myString对象中首次出现的位置 * @param[in] str :需要查找的子符串 * @param[out] * @return 如果查找到,则返回首次查找到时的下标;如果没有找到,则返回-1 * * @detail * @date 2021-7-15 */ int MyString::FindStr(const char* str) { // 双指针 for (size_t i = 0; i < strlen(m_str); i++) { size_t j = 0; if (this->m_str[i] == str[j]) { while(i < strlen(m_str) && j < strlen(str) && this->m_str[i+j] == str[j]) { if(j == (strlen(str)-1)) return i; else j++; } } } return -1; } /* * @fn getStr * @brief 从指定位置开始返回myString对象中指定长度的子串,如果没有则返回NULL * @param[in] n :开始位置 len :从开始位置计算的长度 * @param[out] * @return myString对象 * * @detail * @date 2021-7-15 */ MyString MyString::GetStr(const int& n,const size_t& len) { assert(m_str[n] != NULL); char *p = this->m_str; MyString ret; delete [] ret.m_str; // 必须释放当临时成员空间,不然会造成泄漏 ret.m_str = new char[len+1]; size_t i = 0; while (i < len) { assert(m_str[n+i] != NULL); ret.m_str[i] = p[n+i]; i++; } ret.m_str[len] = '\0'; return ret; } int MyString::Length(void) { return strlen(m_str); } /* * @fn RemoveLRSpace * @brief 移除首尾空格 * @param[in] * @param[out] * @return myString对象 * * @detail * @date 2021-7-15 */ MyString MyString::RemoveLRSpace(void) { if(m_str == NULL) return *this; RTrim(m_str); LTrim(m_str); return *this; } /* * @fn Compare * @brief 比较两个MyString对象是否相等 * @param[in] * @param[out] * @return int:如果this小于s,返回-1; 如果this等于s,返回0; 如果this大于s, 返回1。 * @detail * @date 2021-7-15 */ int MyString::Compare(const MyString &s) { assert(m_str != NULL && s.m_str != NULL); int ret; ret = strcmp(this->m_str, s.m_str); return ret; } //左移运算符重载 ostream& operator<<(ostream &out, MyString &s) { out << s.m_str; return out; } //右移运算符重载 istream& operator>>(istream &in, MyString &s) { char p[50]; in.getline(p, 50); s = p; return in; }
main.cpp
/******************************************************************************** * * filename : main.cpp * description : 测试入口 * ********************************************************************************/ #include <iostream> #include "myString.h" int main(int argc, const char **argv) { MyString m1("hello"); MyString m2("WORLD!"); MyString m3; m3 = m1 + " " + m2; cout << "m3 = " << m3 << endl; MyString m4(m3); cout << "m4 = " << m4 << endl; cout << "m4.length() = " << m4.Length() << endl; // ok cout << "m4[1] = " << m4[1] << endl; // ok cout << "m4.toLower()" << m4.ToLower() << endl; // ok cout << "m4.toUpper()" << m4.ToUpper() << endl; // ok MyString ans = m4.GetStr(1,2); // ok cout << "m4.getStr(1,2) = " << ans << endl; int pos = m4.FindStr("WOR"); // ok cout << "m4.findStr(\"WOR\"):" << pos << endl; cout << "(m1 < m2)" << (m1 < m2) << endl; cout << "(m1 > m2)" << (m1 > m2) << endl; cout << "(m1 == m3)" << (m1 == m3) << endl; MyString m5 = " space "; m5.RemoveLRSpace(); cout << m5 << endl; return 0; }
本文来自博客园,作者:StimuMing,转载请注明原文链接:https://www.cnblogs.com/fole-del/p/15030450.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步