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);
}