C/C++自定义string类

笔试的时候遇到这题:自定义string类
需要实现的成员函数都已经给出,学过但是自己写起来才发现还很多细节没把握到。习惯用C++的string写代码,C语言的char字符串数组的知识都快忘光了。
笔试完继续修改,调试,运行全部为1,表示对应函数实现正确。
注意的点:

  1. 字符数组的拷贝通常用strcpy(a, b),表示b拷贝到a
  2. strlen(a)表示的是字符串数组a的长度,不包含最后的‘\0’,但是申请动态空间的时候,需要在字符串字符个数+1,‘\0’是经常要注意的!
  3. qsort(数组名,数组大小,sizeof(数组名[0]),自定义static比较方法cmp),内部使用的快排。
  4. C++中的比较使用sort比较熟练,C库中的还是第一次接触
  5. 还有一些字符串的操作,记录在我的这篇博客字符串操作

代码如下:

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
class string
{
public:

	string(const char* src = NULL)
	{
		//TODO1:构造函数
		//开始添加代码
        if(src == NULL){
            m_data = new char[1];
            m_data[0] = '\0';
            m_length = 0;
        }else{
            m_length = strlen(src);
            m_data = new char[m_length + 1];
            strcpy(m_data, src);
        }
		//结束添加代码
	}

	~string()
	{
		//TODO2:析构函数
		//开始添加代码
        delete[] m_data;
		//结束添加代码
	}

	int size() const
	{
		return m_length;
	}

	const char *c_str() const
	{
		return m_data;
	}

	string(const string &src)
	{
		//TODO3:拷贝构造函数
		//开始添加代码
        m_length = src.size();
        m_data = new char[m_length + 1];
        strcpy(m_data, src.m_data);
		//结束添加代码
	}

	string operator+(const string &src) const
	{
		string ret;
		//TODO4:运算符+
		//开始添加代码
        int length = m_length + src.size();
		ret.m_length = length;
        ret.m_data = new char[length + 1];
        strcat(ret.m_data, m_data);
        strcat(ret.m_data, src.m_data);
		//结束添加代码
		return ret;
	}

	string& operator+=(const string &src)
	{
		//TODO5:运算符+=
		//开始添加代码		
		int length = m_length + src.size();
		m_length = length;
		char* m_data_copy = new char[length + 1];
		strcat(m_data_copy, m_data);
		strcat(m_data_copy, src.m_data);
		m_data = m_data_copy;
		//结束添加代码
		return *this;
	}

	bool operator==(const string &str) const
	{
		//TODO5:运算符==
		//开始添加代码
        if(strcmp(this->m_data, str.m_data) == 0) return true;
        else return false;
		//结束添加代码
	}

	void Reverse()
	{
		//TODO5:字符串反转
		//开始添加代码
		//std::cout << m_data << std::endl;
		int i = 0, j = size() - 1;
		if(i >= j) return;
		while(i < j){
			char t = m_data[i];
			m_data[i] = m_data[j];
			m_data[j] = t; 
			i++;
			j--;
		}
		return;
		//结束添加代码
	}

	void Sort()
	{
		//TODO6:字符串从小到大排序
		//开始添加代码
		qsort(m_data, m_length, sizeof(m_data[0]), cmp);
		//结束添加代码
	}
	static int cmp(const void* a, const void* b){
		char* _a = (char*)a;
		char* _b = (char*)b;
		return strcmp(_a, _b);
	}
private:
	char *m_data;
	int m_length;
};

int main()
{
	//构造函数
	string str1 = "abcde";
	string str2("12345");

	//拷贝构造函数
	string str3 = str1;
	std::cout << (str3 == str1) << std::endl;

	//拷贝构造函数
	string str4(str2);
	std::cout << (str2 == str4) << std::endl;

	//+ 运算符
	string str5 = str1 + str2;
	std::cout << (str5 == "abcde12345") << std::endl;
	std::cout << (str5.size() == str1.size() + str2.size()) << std::endl;

	//+= 运算符
	str5 += str1;
	std::cout << (str5 == "abcde12345abcde") << std::endl;

	//反转
	string str6 = "12345678";
	str6.Reverse();
	std::cout << (str6 == "87654321") << std::endl;

	//排序
	string str7 = "202008131617";
	str7.Sort();
	std::cout << (str7 == "000111223678") << std::endl;
	return 0;
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jasscical

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值