实现自己的字符串类
#include <cstring>
#include <iostream>
#include <cstdarg>
using namespace std;
#define TMP_STR_LEN (100)
class HadesString
{
private:
char* _szStr = nullptr;
int _iLen = 0;
// 检查并清空字符串和长度的值
bool CheckAndFreeMember()
{
if (_iLen > 0 && _szStr)
delete[] _szStr;
_iLen = 0;
_szStr = nullptr;
return true;
}
// 设置字符串和长度的值
bool SetMemberValue(const char* str)
{
bool bRet = false;
do
{
_iLen = strlen(str);
_szStr = new char[_iLen + sizeof(char)];
strcpy(_szStr, str);
bRet = true;
} while (false);
return bRet;
}
// 给字符串添加内容
bool AppendContent(const char* szFmt, size_t nContentSize, ...)
{
bool bRet = false;
char* szResult = nullptr;
do
{
int iNewSize = _iLen + sizeof(char) * 2 + nContentSize;
va_list args;
va_start(args, nContentSize);
//__crt_va_start(args, nContentSize);
#if defined _NO_CRT_STDIO_INLINE
;
#else
{
szResult = new char[iNewSize];
memset(szResult, 0x00, sizeof(szResult));
#pragma warning(push)
#pragma warning(disable: 4996) // Deprecation
_vsprintf_l(szResult, szFmt, NULL, args);
#pragma warning(pop)
}
#endif
va_end(args);
//__crt_va_end(args);
if (!CheckAndFreeMember())
break;
if (!SetMemberValue(szResult))
break;
bRet = true;
} while (false);
if (szResult)
delete[] szResult;
return bRet;
}
public:
HadesString(char* str = "Hello Hades!")
{
SetMemberValue(str);
}
// 析构函数
~HadesString()
{
delete[] _szStr;
_iLen = 0;
}
// 获取字符串长度 记录的
int GetLen()
{
return _iLen;
}
// 获取字符串
char* GetString()
{
return _szStr;
}
// 设置字符串
char* SetString(char* str)
{
char* szRet = nullptr;
do
{
if (!CheckAndFreeMember())
break;
if (!SetMemberValue(str))
break;
szRet = _szStr;
} while (false);
return szRet;
}
// 获得某个下标的字符
char GetChar(size_t index)
{
char cRet = 0;
do
{
if (index >= _iLen)
break;
cRet = _szStr[index];
} while (false);
return cRet;
}
// 获取数组长度
size_t GetLenOfArray()
{
return _iLen + sizeof(char);
}
// 获取字符串长度
size_t GetLenOfStr()
{
return strlen(_szStr);
}
// 替换字符串中的字符为另一个(全部替换)
char* ReplaceChar(const char cSrc, const char cTarget)
{
char* szRet = nullptr;
for (size_t i = 0; i < _iLen; i++)
{
if (cSrc == _szStr[i])
{
_szStr[i] = cTarget;
}
}
szRet = _szStr;
return szRet;
}
// 替换字符串(全部替换)
char* ReplaceStr(const char* szSrc, const char* szTarget)
{
char* szRet = nullptr;
char* szOrig = nullptr;
do
{
size_t iSzSrcSize = strlen(szSrc);
if (_iLen < iSzSrcSize)
break;
szOrig = new char[_iLen + sizeof(char)];
memset(szOrig, 0x00, sizeof(szOrig));
strcpy(szOrig, _szStr);
int iLenOrig = _iLen;
if (!CheckAndFreeMember())
break;
if (!SetMemberValue(""))
break;
size_t iIndex = 0;
for (; iIndex < iLenOrig - iSzSrcSize; )
{
if (strncmp((szOrig + iIndex), szSrc, strlen(szSrc)) == 0)
{
AppendContent("%s%s", strlen(szTarget), _szStr, szTarget);
iIndex += strlen(szSrc);
}
else
{
AppendContent("%s%c", sizeof(char), _szStr, szOrig[iIndex]);
iIndex++;
}
}
for (; iIndex < iLenOrig; iIndex++)
{
AppendContent("%s%c", sizeof(char), _szStr, szOrig[iIndex]);
}
szRet = _szStr;
} while (false);
if (szOrig)
delete[] szOrig;
return szRet;
}
// 查找字符串
char* FindStr(const char* szStr)
{
int iIndex = 0;
bool bFindResult = 0;
char* szResult = nullptr;
do
{
size_t iSzStrSize = strlen(szStr);
if (_iLen < iSzStrSize)
break;
for (; iIndex < _iLen - iSzStrSize; iIndex++)
{
if (strncmp((_szStr + iIndex), szStr, strlen(szStr)) == 0)
{
bFindResult = true;
break;
}
}
if (bFindResult)
{
szResult = _szStr + iIndex;
}
} while (false);
return szResult;
}
// 结尾增加字符
char* Append(const char c)
{
char* szRet = nullptr;
do
{
if (!AppendContent("%s%c", sizeof(c), _szStr, c))
break;
szRet = _szStr;
} while (false);
return szRet;
}
// 结尾增加字符串
char* Append(const char* szStr)
{
char* szRet = nullptr;
do
{
if (!AppendContent("%s%s", strlen(szStr), _szStr, szStr))
break;
szRet = _szStr;
} while (false);
return szRet;
}
// 结尾增加整数
char* Append(int iVal)
{
char* szRet = nullptr;
do
{
char szTmp[TMP_STR_LEN] = { 0 };
sprintf_s(szTmp, TMP_STR_LEN, "%d", iVal);
if (!AppendContent("%s%d", strlen(szTmp), _szStr, iVal))
break;
szRet = _szStr;
} while (false);
return szRet;
}
// 结尾增加浮点数
char* Append(double dVal)
{
char* szRet = nullptr;
do
{
char szTmp[TMP_STR_LEN] = { 0 };
sprintf_s(szTmp, TMP_STR_LEN, "%f", dVal);
if (!AppendContent("%s%f", strlen(szTmp), _szStr, dVal))
break;
szRet = _szStr;
} while (false);
return szRet;
}
// 结尾增加HadesString
char* Append(const HadesString& hstr)
{
char* szRet = nullptr;
do
{
char* szTmp = const_cast<HadesString&>(hstr).GetString();
if (!AppendContent("%s%s", strlen(szTmp), _szStr, szTmp))
break;
szRet = _szStr;
} while (false);
return szRet;
}
// 头部弹出字符
char* PopCharFromHead()
{
char* szRet = nullptr;
char* szResult = nullptr;
do
{
szResult = new char[_iLen];
memset(szResult, 0x00, sizeof(szResult));
strcpy(szResult, _szStr + 1);
if (!CheckAndFreeMember())
break;
if (!SetMemberValue(szResult))
break;
szRet = _szStr;
} while (false);
if (szResult)
delete[] szResult;
return szRet;
}
// 尾部弹出字符
char* PopCharFromTail()
{
char* szRet = nullptr;
char* szResult = nullptr;
do
{
szResult = new char[_iLen + sizeof(char)];
memset(szResult, 0x00, sizeof(szResult));
int iCopyLen = strlen(_szStr) - 1;
strcpy(szResult, _szStr);
szResult[iCopyLen] = '\0';
if (!CheckAndFreeMember())
break;
if (!SetMemberValue(szResult))
break;
szRet = _szStr;
} while (false);
if (szResult)
delete[] szResult;
return szRet;
}
};
int main()
{
HadesString str("Hello Hades! ");
cout << "原始字符串:[" << str.GetString() << "]" << endl;
cout << "设置字符串:[Hades Studio!!! HaHaha, NaN, OtoO. Http://www.hxhlb.org]" << endl;
str.SetString("Hades Studio!!! HaHaha, NaN, OtoO. Http://www.hxhlb.org");
cout << "设置后的字符串:[" << str.GetString() << "]" << endl;
cout << "获取第2个字符:[" << str.GetChar(1) << "]" << endl;
cout << "字符串长度:[" << str.GetLenOfStr() << "]" << endl;
cout << "字符串长度2:[" << str.GetLen() << "]" << endl;
cout << "数组长度:[" << str.GetLenOfArray() << "]" << endl;
cout << "修改字符H为T:[" << str.ReplaceChar('H', 'T') << "]" << endl;
cout << "还原修改字符:[" << str.ReplaceChar('T', 'H') << "]" << endl;
cout << "查找:[ha]:[" << str.FindStr("ha") << "]" << endl;
cout << "替换:[Ha --> hA]:[" << str.ReplaceStr("Ha", "hA") << "]" << endl;
cout << "替换:[ha --> HA]:[" << str.ReplaceStr("hA", "Ha") << "]" << endl;
cout << "替换:[Ha --> hxhlb]:[" << str.ReplaceStr("Ha", "hxhlb") << "]" << endl;
cout << "替换:[hxhlb --> Ha]:[" << str.ReplaceStr("hxhlb", "Ha") << "]" << endl;
cout << "末尾追加[H]:[" << str.Append('H') << "]" << endl;
cout << "末尾追加[Hades]:[" << str.Append("Hades") << "]" << endl;
cout << "末尾追加[666]:[" << str.Append(666) << "]" << endl;
cout << "末尾追加[888.123456]:[" << str.Append(888.123456) << "]" << endl;
HadesString strAppend("HTTP://WWW.HXHLB.ORG");
cout << "新的字符串对象:[" << strAppend.GetString() << "]" << endl;
cout << "末尾追加新的字符串对象:[" << str.Append(strAppend) << "]" << endl;
cout << "弹出第一个字符:[" << str.PopCharFromHead() << "]" << endl;
cout << "弹出第一个字符:[" << str.PopCharFromHead() << "]" << endl;
cout << "弹出最后一个字符:[" << str.PopCharFromTail() << "]" << endl;
cout << "弹出最后一个字符:[" << str.PopCharFromTail() << "]" << endl;
cout << "最终结果:[" << str.GetString() << "]" << endl;
system("pause");
return 0;
}如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-01-04 at 01:50 am