CString

String.h的头文件

#define _CRT_SECURE_NO_WARNINGS

#include<string.h>

#define zjlCINT const int

class CString
{
protected:
	char *Create();
	char * m_data;
public:
	//初始化
	//1、不赋值
	CString();
	//2、赋值char类型
	CString(const char* str);
	//3、赋值CString类型
	CString(const CString& s);
	//4、数字转字符
	CString(const int n);
	~CString();
	operator char*();   //返回m_data
	//给m_data重新赋值
	CString operator=(CString &s);  
	CString operator=(const char* str);
	//相加  不是CString类型的不能开头
	CString operator+(CString &s);
	CString operator+(const char *str);
	CString operator+=(CString &s);
	CString operator+=(const char *str);
	//获取第几个字符
	char operator[](int Position);

	//大小写转换
	char *Up();
	char *Down();
	char *UpPart(int start, int end);//start--起始的字符位置   end---结束字符位置
	char *DownPart(int start, int end);
	//字符转数字
	int *StrToNum();  //全部数字转换成字符
	int *StrtToNum_Part(int start, int end);  //start--起始的字符位置   end---结束字符位置
	int StrToNum_Single(int Position);        //单个
	//数字转字符
	void NumToStr(int n);
	void NumToStr_Part(int n, int start, int end); //将数字的某一段转换成字符
	void NumToStr_Single(int n, int Position);  //某一位的数字,n--数字  Position--对应的位置
	
	//获取一段字符串
	char *GetPart(zjlCINT start, zjlCINT end);  //截取某一段字符串,start---end的位置
	char *GetEnd(zjlCINT start);               //从某一段开始截取到末尾
	char *GetStart(zjlCINT end);               //从开头截取到某一位置
	
	int size()const;
};

CString.cpp的具体实现

#include "String.h"

//strlen()计算出来的长度,不包括'\0'。所以需要加1

char * CString::Create()
{
	char *data = new char[size() + 1];
	strcpy(data, m_data);
	return data;
}

CString::CString()
{
	m_data = new char[2];
	strcpy(m_data, "\0");
}

CString::CString(const char * str)
{
	int nLen = strlen(str);
	m_data = new char[nLen + 1];
	strcpy(m_data, str);
}

CString::CString(const CString & s)
{
	int nLen = s.size();
	m_data = new char[nLen + 1];
	strcpy(m_data, s.m_data);
}

CString::CString(const int n)
{
	NumToStr(n);
}

CString::~CString()
{
	delete []m_data;
}

CString::operator char*()
{
	return m_data;
}

CString CString::operator=(CString & s)
{
	if (size() < s.size())
	{
		delete[] m_data;
		m_data = new char[s.size() + 1];
	}
	else
	{
		int i = 0;
		while (i <= size())
			m_data[i++] = 0;
	}
	strcpy(m_data, s.m_data);
	return m_data;
}

CString CString::operator=(const char * str)
{
	int nLen = strlen(str);
	if (nLen > size())
	{
		delete[] m_data;
		m_data = new char[nLen + 1];
	}
	else
	{
		int i = 0;
		while (i <= size())
			m_data[i++] = 0;
	}
	strcpy(m_data, str);
	return m_data;
}

CString CString::operator+(CString & s)
{
	int nLen = s.size() + size();
	CString data = m_data;
	delete[] m_data;
	m_data = new char[nLen + 1];
	strcpy(m_data, data.m_data);
	strcat(m_data, s.m_data);
	return m_data;
}

CString CString::operator+(const char * str)
{
	CString data = m_data;
	int nLen = strlen(str) + size();
	delete[] m_data;
	m_data = new char[nLen + 1];
	strcpy(m_data, data.m_data);
	strcat(m_data, str);
	return m_data;
}

CString CString::operator+=(CString & s)
{
	CString t = m_data;
	delete[] m_data;
	m_data = new char[s.size() + t.size() + 1];
	strcpy(m_data, t.m_data);
	strcat(m_data, s.m_data);
	return m_data;
}

CString CString::operator+=(const char * str)
{
	CString t = m_data;
	delete[] m_data;
	m_data = new char[t.size() + strlen(str) + 1];
	strcpy(m_data, t.m_data);
	strcat(m_data, str);
	return m_data;
}

char CString::operator[](int Position)
{
	char s = *(m_data+Position);  //*(m_data+Position) == m_data[Position]
	return s;
}

char * CString::Up()
{
	int i = 0;
	char *data = Create();
	while (i <= size())
	{//97--122  小写字母   65--90  大写字母    
		if (96 < data[i] && 123 > data[i])
			data[i] = data[i] - 32;
		i++;
	}
	return data;
}

char * CString::Down()
{
	char *data = Create();
	int i = 0;
	while (i < size())
	{
		if (64 < data[i] && 91 > data[i])
			data[i] = data[i] + 32;
		i++;
	}
	return data;
}

char * CString::UpPart(int start, int end)
{
	char *data = Create();
	int i = start;
	while (i <= end)
	{
		if (96 < data[i] && 123 > data[i])
			data[i] = data[i] - 32;
		i++;
	}
	return data;
}

char * CString::DownPart(int start, int end)
{
	char *data = Create();
	int i = start;;
	while (i <= end)
	{
		if (64 < data[i] && 91 > data[i])
			data[i] = data[i] + 32;
		i++;
	}
	return data;
}

int *CString::StrToNum()
{
	int nCount = 0, i = 0;
	while (i <= size())
	{//48--57  字符数字
		if (47 < m_data[i] && 58 > m_data[i])
			nCount++;
		i++;
	}
	int *n = new int[nCount];
	nCount = 0;
	for (i = 0; i < size(); i++)
	{
		if (47 < m_data[i] && 58 > m_data[i])
			n[nCount++] = m_data[i] - 48;
	}
	return n;
}

int * CString::StrtToNum_Part(int start, int end)
{
	int i = start, nCount = 0;
	while (i <= end)
	{
		if (47 < m_data[i] && 58 > m_data[i])
			nCount++;
		i++;
	}
	int *n = new int[nCount];
	nCount = 0;
	for (i = start; i <= end; i++)
	{
		if (47 < m_data[i] && 58 > m_data[i])
			n[nCount++] = m_data[i] - 48;
	}
	return n;
}

int CString::StrToNum_Single(int Position)
{
	int n;
	if (47 < m_data[Position] && 58 > m_data[Position])
		n = m_data[Position] - 48;
	return n;
}

void CString::NumToStr(int n)
{
	char s[1024];
	int j = 0;
	while (n != 0)
	{
		s[j++] = (n % 10) + 48;   //加48是ascii字符数字对应十进制
		n = (int)(n / 10);
	}
	s[j] = '\0';
	delete []m_data;
	m_data = new char[j + 1];
	int i = 0, h = j - 1;
	while (i <= j)
		m_data[i++] = s[h--];
	m_data[j] = '\0';
}

void CString::NumToStr_Part(int n, int start, int end)
{
	delete[] m_data;
	m_data = new char[end - start + 2];
	char s[1024];
	int i = 0;
	while (n != 0)
	{
		s[i++] = n % 10;
		n = n / 10;
	}
	s[i] = '\0';
	int j = 0, k = i;
	for (i = k - start - 1; i >= k - 1 - end; i--)
		m_data[j++] = s[i] + 48;
	m_data[end - start + 1] = '\0';
}

void CString::NumToStr_Single(int n, int Position)
{
	char s[1024];
	delete[] m_data;
	m_data = new char[2];
	m_data[1] = '\0';
	int j = 0;
	while (n != 0)
	{
		s[j++] = n % 10;
		n = n / 10;
	}
	//判断Position是否超过j的大小
	if (Position <= j)
		m_data[0] = s[j - Position - 1] + 48;
}

char *CString::GetPart(zjlCINT start, zjlCINT end)
{
	char *data = new char[end - start + 2];
	int i = start;
	while (i <= end)
	{
		data[i - start] = m_data[i];
		i++;
	}
	data[i - start] = '\0';
	return data;
}

char * CString::GetEnd(zjlCINT start)
{
	/*char *data = new char[size() - start + 2];
	int i = start;
	while (i <= size())
	{
		data[i - start] = m_data[i];  //m_data + i == m_data[i]
		i++;
	}
	data[i - start] = '\0';
	return data;*/
	return GetPart(start, size());
}

char * CString::GetStart(zjlCINT end)
{
	/*char *data = new char[end + 2];
	int i = 0;
	while (i <= end)
	{
		data[i] = m_data[i];
		i++;
	}
	data[i] = '\0';
	return data;*/
	return GetPart(0, end);
}

int CString::size() const
{
	return strlen(m_data);
}

猜你喜欢

转载自blog.csdn.net/qq_38611124/article/details/82312763
今日推荐