⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mystr.h

📁 内存管理程序
💻 H
字号:
/*===============================================================
 *       filename    :  mystr.h
 *       description :
 *       modification history:
 *=============================================================*/
#ifndef __MYSTR_H__
#define __MYSTR_H__

#include "globaldef.h"
#include "stdarg.h"
#include "pthread.h"
#include <vector>

using namespace std;

#define DEFAULT_CSTR_LENGTH      32
typedef struct SDesc
{
  //data area
	char*	m_Text;		// 0-terminated string, or next free SDesc* if m_Usage==0
	int	       m_Length;	// Actual string length, excl. 0
	int	       m_Alloc;	// Allocated length, excl. 0
};

/*********************************************************************
* Class:	CStr
* Purpose:	实现动态string
*********************************************************************/
class CStr
{

// 数据块及内部访问方法
private:
		SDesc data;
		int   m_wordfindpos;//记录搜索下一个单词的起始位置

// 构造, 复制, 分配
public:
		CStr(const CStr& source);	//复制构造函数
		CStr( const CStr * source );
		CStr(const char* s, int prealloc = DEFAULT_CSTR_LENGTH);		//从以0结束的字符串进行构造
		CStr(int prealloc = DEFAULT_CSTR_LENGTH);		//开辟一个字符串,内容为空,但分配prealloc个字节
		const CStr& operator=(const CStr& source);	//'='运算符重载,CStr
		const CStr& operator=(const char* s);		//'='运算符重载,以0结束字符串
		const CStr& operator=(const char ch);		//'='运算符重载,字符
		~CStr();		//析构函数

// 对属性,数据,及比较的操作

		bool IsEmpty() const;			//判断是否为空,为空则返回TRUE,
		int GetLength() const;			//取得长度
		operator const char* () const;	//强制转换为静态指针
		operator char* () const;	//强制转换为指针
		
		char* GetString() const;	//取得字符串,以\0结束		
		char GetFirstChar() const;		//取得第一个字符
		char GetLastChar() const;		//取得最后一个字符
		char operator[](int idx) const;//取相应位置的字符	
		char GetAt(int idx) const;		//取相应位置的字符
		char * GetBuffer( int idx )const; //Get pointer of the string at position idx
		void GetLeft (int chars, CStr& result);	//取第chars个字符以左的子串
		void GetRight (int chars, CStr& result);	//取最右边chars个字符
		CStr Left( int pos ); //Get the substring from beginning to pos
		CStr Right( int pos ); //Get the substring from pos to the end
		CStr Mid( int nFirst );//same as Right();
		CStr Mid( int nFirst, int nchars );

		void GetMiddle (int start, int chars, CStr& result);	//从start开始取chars个字符作为子串
		int  GetWord(CStr& result);		//取出一个单词(以空格为分界,不包括空格).返回1表示成功,-1表示失败.该函数可反复调用,会自动向后挨个取出所有单词,直到返回-1为止.
		int  GetFirstWord(CStr& result);//取出第一个单词(以空格为分界,不包括空格).返回1成功,-1失败
		int  GetLastWord(CStr& result);	//取出最后一个单词(以空格为分界,不包括空格).返回1成功,-1失败
    
		int  IsAlpha();		//判断str中是否全为字母,如果是返回0,否则返回第一个非字母的字符下标
		int  IsDigit();		//判断str中是否全为数字,如果是返回0,否则返回第一个非数字的字符下标
		int  ConvertInt();	//将str中的数字转换成相应的整数,会自动判断出str中的数字部分,返回的是转换的结果,具体可参见atoi的MSDN帮助

		int  Find (char ch, int startat = 0) const;				//从位置startat开始查找第一个出现字符ch的位置.当查找成功返回相应下标,否则返回-1
		int  Find( const char *match,int startat = 0) const;		//从位置startat开始查找第一个出现子串match的位置.当查找成功返回相应下标,否则返回-1
		int  ReverseFind (char ch, int startat = (int) -1) const;	//从位置startat开始倒着查找第一个出现ch的位置.当查找成功返回相应下标,否则返回-1
		int  ReverseFind (const char *match,int len, int startat = (int) -1) const;	// 从位置startat开始倒着查找第一个出现子串match的位置.当查找成功返回相应下标,否则返回-1
	
		bool Equal(const char* match,int charnum);
		int  Compare (const char* match,int chars=0) const;    	//和串match进行chars个字符的比较,返回值分别为 -1, 0 or 1 , 当chars为0时表示全部比较
		int  CompareNoCase (const char* match,int chars=0) const;	//同上,不区分大小写


// 全局修改
		void Empty();			//清空字符串中的内容(但不释放所占的内存,这一点对程序员而言透明)
		void GrowTo(int size);	//增加内存分配空间
		void Format(const char* fmt, ...);	//对字符串进行格式化
		//void FormatRes(UINT resid, ...);	//对mfc中的字符串资源进行格式化,但并未实现
		//bool LoadString(UINT resid);		//

// 追加, 提取
		void operator += (const CStr& obj);	//'+='运算符重载,追加CStr
		void operator += (const char* s);	//'+='运算符重载,追加0结束字符串
		void operator += (const char ch);	//'+='运算符重载,追加字符	
		void AddString(const CStr& obj);	//追加CStr	
		void AddString(const char* s);		//追加0结束字符串	
		void AddChar(char ch);				//追加字符
		void AddChars(const char* s, int startat, int howmany);	//追加字符串s中从startat开始的howmany个字符,
		void AddStringAtLeft(const CStr& obj);			//在开头处添加字符串CStr
		void AddStringAtLeft(const char* s);			//在开头处添加0结束字符串s
		void AddInt(int value);				//追加整数value
		void AddDouble(double value, UINT after_dot);	//追加实数value,其中实数小数点后位数为after_dot
		void RemoveLeft(int count);		//去掉左边的count个字符
		void RemoveMiddle(int start, int count);		//去掉从start位置开始的count个字符
		void RemoveRight(int count);		//去掉右边的count个字符
		void TruncateAt(int idx);			//从位置idx截断(用添加\0的方式)
		friend CStr operator+(const CStr& s1, const CStr& s2);		//拼接操作
		friend CStr operator+(const CStr& s, const char* lpsz);		//拼接操作
		friend CStr operator+(const char* lpsz, const CStr& s);		//拼接操作
		friend CStr operator+(const CStr& s, const char ch);		//拼接操作
		friend CStr operator+(const char ch, const CStr& s);		//拼接操作
		void RTrim(const char* charset = NULL);		//去掉所有右边的多余字符,传入参数为NULL时表示空格,用户可以自己传入(甚至可以是一组字符)
		void LTrim(const char* charset = NULL);		//见上者说明
		void AllTrim(const char* charset = NULL);	//前两者说明合二为一
		
	
// 其他的实现方法
protected:
		void NewFromString(const char* s, int slen, int prealloc);	//[内部实现]
		void Buffer (int newlength);				//[内部实现]
		void CoreAddChars(const char* s, int howmany);		//[内部实现]
		void FormatCore (const char* x, va_list& marker);	//[内部实现]
		bool FmtOneValue (const char*& x, va_list& marker);	//[内部实现]

public:			
		// 错误处理
		static void ThrowIfNull(void* p);	//[内部实现]
		static void ThrowPgmError();		//[内部实现]
		static void ThrowNoUnicode();		//[内部实现]
		static void ThrowBadIndex();		//[内部实现]


//为了和CString的用法相兼容,特别补允以下功能函数

		//各种转换函数
		void MakeUpper();
		void MakeLower();
		void MakeReverse();//前后倒置
		int  Replace( const char chOld, const char chNew );
		int  Replace( const char* lpszOld, const char* lpszNew );
		void SetEndChar(const char ch);
		int  FindOneOf( const char* lpszCharSet ) const;
};

bool operator ==(const CStr& s1, const CStr& s2);	//对两个字符串的比较操作
bool operator ==(const CStr& s1, LPCTSTR s2);		//对两个字符串的比较操作
bool operator ==(LPCTSTR s1, const CStr& s2);		//对两个字符串的比较操作
bool operator !=(const CStr& s1, const CStr& s2);	//对两个字符串的比较操作
bool operator !=(const CStr& s1, LPCTSTR s2);		//对两个字符串的比较操作
bool operator !=(LPCTSTR s1, const CStr& s2);		//对两个字符串的比较操作

/*********************************************************************
* Procs:	CStr::ThrowXXX()
* Purpose:	异常处理
*********************************************************************/

void cstr_abort_application(int fatal_type);
inline void CStr::ThrowBadIndex()		{ cstr_abort_application(2); }
inline void CStr::ThrowPgmError()		{ cstr_abort_application(3); }
inline void CStr::ThrowNoUnicode()		{ cstr_abort_application(4); }


//  若想做空指针检查,请实现以下方法
//      void CStr::ThrowIfNull(void*)
//      { if (p == NULL)
//           ThrowSomeFatalError();
//      }
inline void CStr::ThrowIfNull(void*)  { /* no-op */ }

/*********************************************************************
* Proc:		CStr::GetFirstChar
*********************************************************************/

inline char CStr::GetFirstChar() const
{
	return data.m_Text[0];
}


/*********************************************************************
* Proc:		CStr::IsEmpty and GetLength
*********************************************************************/

inline bool CStr::IsEmpty() const
{
	return ( data.m_Length == 0 );
}

inline int CStr::GetLength() const
{
	return data.m_Length;
}


/*********************************************************************
* Proc:		CStr::operator []
*********************************************************************/

inline char CStr::operator[](int idx) const
{
#ifdef _DEBUG
	if ( idx >= data.m_Length )
		ThrowBadIndex();
#endif

	return data.m_Text[idx];
}

inline char CStr::GetAt(int idx) const
{
	return data.m_Text[idx];
}

inline char * CStr::GetBuffer( int idx )const
{
	return &(data.m_Text[idx]);
}
/*********************************************************************
* Proc:		CStr::operator 'cast to const char*'
*********************************************************************/

inline CStr::operator const char* () const
{
	return data.m_Text;
}

inline CStr::operator  char* () const
{
	return data.m_Text;
}

inline char* CStr::GetString() const
{
	return data.m_Text;
}


/*********************************************************************
* Proc:		CStr::[operator ==] and [operator !=] inlined forms
*********************************************************************/

inline bool operator ==(LPCTSTR s1, const CStr& s2)
{ return (s2 == s1); }

inline bool operator !=(const CStr& s1, const CStr& s2)
{ return !(s1 == s2); }

inline bool operator !=(const CStr& s1, LPCTSTR s2)
{ return !(s1 == s2); }

inline bool operator !=(LPCTSTR s1, const CStr& s2)
{ return !(s2 == s1); }


/*********************************************************************
* Proc:		CStr::AddString - synonyms for operators +=
*********************************************************************/

inline void CStr::AddString(const CStr& obj)
{ *this += obj; }

inline void CStr::AddString(const char* s)
{ *this += s; }

inline void CStr::AddStringAtLeft(const CStr& obj)
{
	AddStringAtLeft (obj.GetString());
}

inline void CStr::operator += (const char ch)
{
	AddChar (ch);
}


/*********************************************************************
* Proc:		CStr::AllTrim - a combination of RTrim and LTrim
*********************************************************************/
//从头尾移去 charset 字符,默认为空格
inline void CStr::AllTrim(const char* charset /*= NULL*/)
{
	RTrim(charset);
	LTrim(charset);
}

	
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -