#define _CRT_SECURE_NO_WARNINGS
#include <cstring>
#include <iostream>
#include <future>
#define MAX_BYTE 32
typedef unsigned int UINT;
class MyString
{
public:
MyString()
{
_len = 1;
_index = 0;
_str = nullptr;
}
MyString(const char *str)
{
_index = _len = strlen(str);
_str = new char[_len + sizeof(char)];
strcpy(_str, str);
}
~MyString()
{
if (_str)
delete _str;
}
// 设置字符串
void SetString(const char *str)
{
size_t len = strlen(str);
if (len > _len)
{
SetArray(len);
}
strcpy(_str, str);
_index = len + 1;
}
// 获取字符串
const char *GetString() const
{
return _str;
}
char GetCharByIndex(UINT index)
{
char cRet = 0;
if (index < _index)
cRet = _str[index];
return cRet;
}
// 获取字符串长度
size_t GetLenghtOfString()
{
return _index;
}
// 获取数组长度
size_t GetLengthofArray()
{
return _len;
}
// 修改其中指定的字符为另一个字符
UINT SetChars(const char cSrc, const char cDst)
{
UINT iRet = 0;
for (UINT i=0; i<_index; ++i)
{
if (cSrc == _str[i])
{
_str[i] = cDst;
++iRet;
}
}
return iRet;
}
// 查找替换当中所有的字符串
UINT ReplaceWords(const char *strSrc, const char *strDst)
{
UINT iRet = GetSubStrNumber(strSrc), tmpIndex = _len;
char *strTmp = new char[_len];
memcpy(strTmp, _str, _len);
size_t srcLen = strlen(strSrc), dstLen = strlen(strDst);
do
{
if (0 == iRet) break;
if (dstLen > srcLen)
{
if (iRet*(dstLen-srcLen)+_index > _len)
{
SetArray(iRet*(dstLen - srcLen) + _index);
}
}
for (UINT i = 0; i<tmpIndex; )
{
if (0 == strncmp(strTmp+i, strSrc, srcLen))
{
for (UINT j=0; j<dstLen; ++j)
{
_str[_index++] = strDst[j];
}
i += srcLen;
}
else
{
_str[_index++] = strTmp[i++];
}
}
} while (false);
return iRet;
}
// 向字符串的末尾添加一个字符
void Append(const char c)
{
if (_index + sizeof(char) > _len)
{
char *tmpStr = new char[_len];
UINT tmpIndex = _index;
memcpy(tmpStr, _str, _len);
SetArray(_index + sizeof(char));
memcpy(_str, tmpStr, _len);
_index = tmpIndex;
}
_str[_index++] = c;
}
// 在末尾添加一个字符串
void Append(const char *str)
{
if (nullptr != str)
{
size_t len = strlen(str);
for (UINT i=0; i<len; ++i)
{
Append(str[i]);
}
}
}
// 向字符串的末尾添加一个整数
void Append(int iVal)
{
char temp[MAX_BYTE] = { 0 };
sprintf(temp, "%d", iVal);
Append(temp);
}
// 向字符串中添加浮点数
void Append(const double dVal)
{
char temp[MAX_BYTE] = { 0 };
sprintf(temp, "%lf", dVal);
Append(temp);
}
// 向字符串添加MyString对象
void Append(const MyString &myStr)
{
Append(myStr.GetString());
}
private:
// 设置数组,调整数字的大小,并分配空间
void SetArray(size_t len)
{
while (_len < len)
{
_len *= 2;
}
if (_str)
delete[]_str;
_index = 0;
_str = new char[_len];
memset(_str, 0, _len);
}
// 获取子字符串的个数
UINT GetSubStrNumber(const char *subStr)
{
UINT iRet = 0;
size_t subStrSize = strlen(subStr);
char *tmp = _str;
while (true)
{
tmp = strstr(tmp, subStr);
if (nullptr != tmp)
{
++iRet;
}
if (tmp-_str+subStrSize < _len)
{
tmp += subStrSize;
}
else
{
break;
}
}
return iRet;
}
private:
char *_str; // 字符串指针
UINT _index; // 当前字符串的索引,_index位置可以直接加字符的
size_t _len; // 数组的长度
};
int main()
{
MyString str("abcdjjkdhfjk abc jk nfkjh slhghjfuiabciuvh");
UINT ret = str.ReplaceWords("abc", "slhghjfuiabciuvhslhghjfuiabciuvh");
std::cout << str.GetString() << std::endl;
str.Append('a');
std::cout << str.GetString() << std::endl;
str.Append("456");
std::cout << str.GetString() << std::endl;
str.Append(123);
std::cout << str.GetString() << std::endl;
str.Append(654.123456789);
std::cout << str.GetString() << std::endl;
MyString strAppend;
strAppend.SetString("Hello World!");
std::cout << strAppend.GetString() << std::endl;
str.Append(strAppend);
std::cout << str.GetString() << std::endl;
return 0;
}
第三课--之一(对象)实现MyString类的作业
最新推荐文章于 2020-10-22 21:56:37 发布