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

📄 tstring.h

📁 CRegistry注册表
💻 H
字号:
#ifndef _tstring_H
#define _tstring_H

#include <stdarg.h>
#include <stdlib.h>

//转换成大写#define TOUPPER(c) ((((c) >= 'a') && ((c) <= 'z')) ? (c)+'A'-'a' : (c))

class tstring 
{
public:
	char *m_buff;
	size_t m_nLength;	//字符长度	
	size_t m_nBuffer;	//内存空间数
public:
	tstring()
	{
		m_nBuffer=m_nLength=0;
		m_buff=NULL;
	}
	tstring(const char *str)
	{
		if(str==NULL)tstring();
		Set(str,strlen(str));
	}
	tstring(const char *str,int len)
	{
		Set(str,len);
	}
	~tstring(void) { if(m_buff)free(m_buff) ;}

	void  Set(const char *str, size_t len )
	{
		if(str==NULL)len=0;
		m_nBuffer=m_nLength=0;
		m_buff=NULL;
		EnsureBuffer(len);
		size_t sl=strlen(str);
		if(len>sl)len=sl;
		if(len)
		{
			strncpy(m_buff, str,len);
			m_buff[len]=0;
		}
		m_nLength=len;
	}

	void Empty(){ if(m_buff) memset(m_buff,0,m_nBuffer);m_nLength=0;}

	void TrimRight();
	void TrimLeft();

	void Insert(size_t pos,const char *str);
	int Delete(int nIndex, int nCount = 1);
	
	char* GetBuffer(size_t size=-1)
	{
		if(size!=-1 && m_nBuffer<size)
		{
			m_buff=(char *)realloc(m_buff,size*sizeof(char));
			memset(m_buff+m_nLength,0,size-m_nLength);
			m_nBuffer=size;
		}
		return m_buff;
	}
	void ReleaseBuffer()
	{
		m_nLength=strlen(m_buff);
	}
	//查询函数
	bool IsEmpty() {return m_nLength==0;}
	size_t GetLength(void) {return m_nLength;}      // return tstring size
	//size_t Find(const char *str);
	size_t Find(const char *str)const
	{
		char *s1=m_buff;
		int i=0;
		for(size_t i=0;i<m_nLength;i++)		{			if (s1[i] == *str)			{				const char *c1 = &s1[i];				const char *c2 = str;				while (*c1 && *c2)				{					if (*c1 != *c2)						break;					c1++;					c2++;				}				if (*c2==0)					return i;			}		}
		return -1;
	}
	//找不到就返回(unsigned int)-1
	size_t FindNoCase(const char *str)
	{
		for(size_t i=0;i<(m_nLength);i++)		{			if (TOUPPER(m_buff[i]) == TOUPPER(*str))			{				const char *c1 = m_buff+i;				const char *c2 = str;				while (*c1 && *c2)				{					if (TOUPPER(*c1) != TOUPPER(*c2))						break;					c1++;					c2++;				}				if (*c2==0)					return i;			}		}		return -1;
	}
	int ReverseFind(char c)
	{
		char *s;
		s=m_buff;
		int i,j;
		for(i=0,j=0;*s;i++)
		{
			if (*s++ == c)
				j = i;
		}
		return j;
	}
	int ReverseFind(const char *str)
	{
		char *s;
		s=m_buff;
		int i,j;
		for(i=0,j=0;*s;i++,s++)
		{
			if(strstr(s,str))
				j = i;
		}
		return j;
	}
	char GetAt(size_t pos){ 
		if(pos<=m_nLength)return m_buff[pos];
		else return NULL;
	}
	char operator[](int nIndex) const
	{
		return m_buff[nIndex];
	}
	void SetAt(size_t pos,const char c)
	{
		if(pos>m_nBuffer)return;
		else
			m_buff[pos]=c;
	}
	tstring Left(int nCount) const
	{
		return Mid(0,nCount);
	}
	tstring Right(int nCount) const;
	tstring Mid(int nFirst, int nCount) const
	{
		tstring result;

		for(int i = nFirst; i < m_nLength && (i - nFirst) < nCount; i ++)
		{
			result += m_buff[i];
		}

		return result;
	}
	tstring Mid(int nFirst) const;

	void MakeUpper();
	void MakeLower();
	void MakeReverse();

	int CompareNoCase(const char* lpsz) const;
	
	//格式化
	void Format(LPCSTR formatstring, ...)
	{
		char buff[4096];
		va_list args;
		va_start(args, formatstring);

		Empty();
	#ifdef WIN32
			int	len = _vsnprintf(buff, sizeof(buff) - 1, formatstring, args)+1;
	#else
			int len = vsnprintf(buff, sizeof(buff) - 1, formatstring, args)+1;
	#endif
		va_end(args);
		
		EnsureBuffer(len);

		va_start(args,formatstring);
		_vsnprintf( m_buff,m_nBuffer, formatstring, args);
		va_end(args);
	}

	//操作符重载
	const tstring& operator=(char ch)
	{
		char str[2] = { ch, 0};
	
		Set((const char*)str,strlen(str));	
		return *this;
	}
	const tstring& operator=(const char * str)
	{
		if(str==NULL)return tstring("");
		Set(str,strlen(str));
		return *this;
	}
	const tstring& operator=(const tstring &obj)
	{
		*this=(const char *)obj;
		return *this;
	}	

	const tstring& operator+=(const char *lpsz)
	{
		if(lpsz)
		{
			int nSize = strlen(lpsz) + m_nLength;
			EnsureBuffer( nSize );
			
			strcpy(m_buff + m_nLength, lpsz);
			m_nLength = nSize;
		}

		return *this;
	}
	const tstring& operator+=(char ch)
	{
		char str[2] = {ch, 0};
		return operator+=((const char*)str);
	}
	const tstring& operator+=(const tstring& string);


	operator const char*() const
	{
		if(m_buff)
			return (const char*)m_buff;
		else
			return "";
	}

	tstring operator-(tstring &obj);       // subtract a String object
	tstring operator-(char *s);            // subtract a quoted string

	bool operator==(const char *s)
	{
		return _tcscmp(m_buff,s)==0;
	}
protected:
	void EnsureBuffer(size_t nLength)
	{
		if ( m_nBuffer - m_nLength > nLength ) return; 

		int nSize= m_nLength + nLength+1;

		if(m_buff)
			m_buff = (char*)realloc( m_buff, nSize ); // May return a different pointer
		else
			m_buff = (char*)malloc(nSize);
		m_nBuffer =nSize;
	}
};

inline bool operator<(const tstring& s1, const tstring& s2)
{
	return ( strcmp(s1, s2) < 0);
}

inline bool operator<(const tstring& s1, const char* s2)
{
	return ( strcmp(s1, s2) < 0);
}
inline bool operator<(const char* s1, const tstring& s2)
{
	return ( strcmp(s1, s2) < 0);
}
inline bool operator>(const tstring& s1, const tstring& s2)
{
	return ( strcmp(s1, s2) > 0);
}
inline bool operator>(const tstring& s1, const char* s2)
{
	return ( strcmp(s1, s2) > 0);
}
inline bool operator>(const char* s1, const tstring& s2)
{
	return ( strcmp(s1, s2) > 0);
}
inline bool operator<=(const tstring& s1, const tstring& s2)
{
	return ( strcmp(s1, s2) <=  0);
}
inline bool operator<=(const tstring& s1, const char* s2)
{
	return ( strcmp(s1, s2) <= 0);
}
inline bool operator<=(const char* s1, const tstring& s2)
{
	return ( strcmp(s1, s2) <= 0);
}
inline bool operator>=(const tstring& s1, const tstring& s2)
{
	return ( strcmp(s1, s2) >= 0);
}
inline bool operator>=(const tstring& s1, const char* s2)
{
	return ( strcmp(s1, s2) >= 0);
}
inline bool operator>=(const char* s1, const tstring& s2)
{
	return ( strcmp(s1, s2) >= 0);
}

#endif

⌨️ 快捷键说明

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