using namespace std;
#include "CTString.h"
int main()
{
CTString *pStr = new CTString("I love you!");
cout << pStr->Size() << endl;
cout << pStr->Empty() << endl;
pStr->Print();
pStr->Copy("Hello");
pStr->Print();
pStr->Connect("World");
pStr->Print();
CTString str("HEHE");
str.Print();
pStr->Copy(&str);
pStr->Print();
CTString str1(10, 'I');
str1.Print();
CTString str2(str1);
str2.Print();
CTString str3(*pStr);
str3.Print();
CTString str4("E");
cout << "str3.Find(&str4)=" << str3.Find(&str4) << endl;
cout << "str3.Find(str4)=" << str3.Find(str4) << endl;
cout << "str4.Find('E') = " << str4.Find('E') << endl;
cout << "对象个数" << CTString::getCount() << endl;
delete pStr;
system("pause");
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*****************CTString类的声明开始********************
#ifndef _CTSTRING_H_
#define _CTSTRING_H_
class CTString
{
public:
//默认构造函数
CTString();
//用n个字符ch来初始化
CTString(int n, char ch);
//直接用C风格字符串来初始化
CTString(char *pData);
//复制构造函数
CTString(const CTString &src);
//析构函数
~CTString();
//功能: 完成串的复制
//参数: src --待复制的指向CTString类对象串
//返回: dest
CTString *Copy(CTString *src);
//功能: 完成串的复制
//参数: src --待复制的C字符串
//返回: 指向CTString类对象的指针
CTString *Copy(char *src);
//功能: 完成串的连接
//参数: src --待连接在后面的CTString对象串
//返回: dest
CTString *Connect(CTString *src);
//功能: 完成串的连接
//参数: src --待连接在后面的C字符串
//返回: dest
CTString *Connect(char *src);
//功能: 在主串中查找子串pSubstr
//参数: pSubstr --指向子串
//返回: 找到则返回指向找到的位置的下标,若没有找到,则返回-1
int Find(const CTString *pSubstr) const;
//功能: 在主串中查找子串substr
//参数: substr --子串的引用
//返回: 找到则返回指向找到的位置的下标,若没有找到,则返回-1
int Find(const CTString &substr) const;
//功能: 在中查找单个字符ch
//参数: ch --待查找的字符
//返回: 找到则返回指向该字符在主串中的位置的下标,若没有找到,刚返回-1
int Find(char ch) const;
//功能: 输出字符数据
//参数: 无
//返回: 无
void Print() const;
//功能: 判断字符串是否为空
//参数: 无
//返回: 若不为空,返回真;若为空,返回假
bool Empty() const;
//功能: 返回字符串的长度
//参数: 无
//返回: 返回字符串的长度--int类型
int Size() const;
//重载操作符 +
//friend const CTString & operator+ (CTString & str1, const CTString & str2);
//功能: 返回m_sCount的值
static int getCount();
private:
char *m_pData; //用于保存字符数据
int m_nLen; //记录字符长度
static int m_sCount; //记录创建对象的个数
};
#endif
//*****************CTString类的声明结束********************
#include <iostream>
#include <cstring>
using namespace std;
#include "CTString.h"
//****************静态成员初始化*****************
int CTString::m_sCount = 0;
//**************默认构造函数实现部分*************
CTString::CTString()
{
m_pData = NULL;
m_nLen = 0;
m_sCount ++;
cout << "constrcutor CTString() called" << endl;
}
//*********构造函数--用n个字符ch来初始化********
CTString::CTString(int n, char ch)
{
m_sCount ++;
m_nLen = n;
m_pData = new char[n+1];
int i;
for (i = 0; i < n; i++)
{
m_pData[i] = ch;
}
m_pData[i] = '\0';
cout << "constrcutor CTString(int n, char ch) called" << endl;
}
//**************带参数构造函数实现部分***********
CTString::CTString(char *pData)
{
m_sCount ++;
m_nLen = strlen(pData);
m_pData = new char[m_nLen + 1]; //预留一个位置给'\0'
strncpy(m_pData, pData, m_nLen);
m_pData[m_nLen] = '\0';
cout << "constrcutor CTString(char *pData) called" << endl;
}
//***************复制构造函数实现部分************
CTString::CTString(const CTString &src)
{
if (this->m_pData != NULL)
{
delete this->m_pData;
}
m_sCount ++;
this->m_pData = new char[src.m_nLen+1];
strncpy(this->m_pData, src.m_pData, src.m_nLen);
this->m_pData[src.m_nLen] = '\0';
this->m_nLen = src.m_nLen;
cout << "copy constrcutor CTString(const CTString &src) called" << endl;
}
//*****************析构函数实现部分**************
CTString::~CTString()
{
cout << "destructor called" << endl;
delete m_pData;
}
//********************************************************
//功能: 完成串的复制
//参数: dest --src的备份 src --待复制的串
//返回: dest
CTString* CTString::Copy(CTString *src)
{
delete this->m_pData;
this->m_pData = new char[src->m_nLen+1];
strncpy(this->m_pData, src->m_pData, src->m_nLen);
this->m_pData[src->m_nLen] = '\0';
this->m_nLen = src->m_nLen;
return this;
}
//*********************************************************
//功能: 完成串的复制
//参数: src --待复制的C字符串
//返回: 指向CTString类对象的指针
CTString* CTString::Copy(char *src)
{
//释放原有空间内存
delete this->m_pData;
int len = strlen(src);
this->m_pData = new char[len+1];
strncpy(this->m_pData, src, len);
this->m_pData[len] = '\0';
this->m_nLen = len;
return this;
}
//*********************************************************
//功能: 完成串的连接
//参数: dest --两个串连接后得到的串 src --待复制的串
//返回: dest
CTString * CTString::Connect(CTString *src)
{
int len = this->m_nLen + src->m_nLen;
char *tmp = new char[len + 1];
strncpy(tmp, this->m_pData, this->m_nLen);
tmp[this->m_nLen] = '\0';
strncat(tmp, src->m_pData, src->m_nLen);
tmp[len] = '\0';
return new CTString(tmp);
}
//**********************************************************
//功能: 完成串的连接
//参数: src --待连接在后面的C字符串
//返回: dest
CTString* CTString::Connect(char *src)
{
int len = strlen(src) + this->m_nLen;
char *tmp = this->m_pData;
this->m_pData = new char[len+1];
int i, j;
for (i = 0; i < strlen(tmp); i++)
{
this->m_pData[i] = tmp[i];
}
for (j = 0; j < strlen(src); i++, j++)
{
this->m_pData[i] = src[j];
}
this->m_pData[len] = '\0';
delete tmp;
return this;
}
//**********************************************************
//功能: 在主串中查找子串pSubstr
//参数: pSubstr --指向子串
//返回: 找到则返回指向找到的位置下标,若没有找到,则返回-1
int CTString::Find(const CTString *pSubstr) const
{
int i = 0, j = 0, index = 0;
int len1 = this->m_nLen,
len2 = pSubstr->m_nLen;
i = 0;
while (i < len1 && j < len2)
{
if (this->m_pData[i] == pSubstr->m_pData[j])
{
i ++;
j ++;
}
else
{
index ++; //主串位置回溯
i = index;
j = 0;
}
}
if (j == len2)
{
return index;
}
return -1;
}
//****************************************************
//功能: 在主串中查找子串substr
//参数: substr --子串的引用
//返回: 找到则返回指向找到的位置的下标,若没有找到,则返回-1
int CTString::Find(const CTString &substr) const
{
int i = 0, j = 0, index = 0;
while (i < this->m_nLen && j < substr.m_nLen)
{
if (this->m_pData[i] == substr.m_pData[j])
{
i ++;
j ++;
}
else
{
index ++;
i = index;
j = 0;
}
}
if (j == substr.m_nLen)
{
return index;
}
return -1;
}
//****************************************************
//功能: 在中查找单个字符ch
//参数: ch --待查找的字符
//返回: 找到则返回指向该字符在主串中的位置的下标,若没有找到,刚返回-1
int CTString::Find(char ch) const
{
for (int i = 0; i < strlen(this->m_pData); i++)
{
if (this->m_pData[i] == ch)
{
return i;
}
}
return -1;
}
//*************************************************
//功能: 输出字符数据
//参数: 无
//返回: 无
void CTString::Print() const
{
if (this->m_pData)
{
cout << this->m_pData << endl;
}
}
//*************************************************
//功能: 判断字符串是否为空
//参数: 无
//返回: 若不为空,返回真;若为空,返回假
bool CTString::Empty() const
{
if (this->m_nLen)
{
return false;
}
return true;
}
//*************************************************
//功能: 返回字符串的长度
//参数: 无
//返回: 返回字符串的长度--int类型
int CTString::Size() const
{
return this->m_nLen;
}
//************************************************
//功能: 返回m_sCount的值
int CTString::getCount()
{
return m_sCount;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////