/**
* @file TString.h
* @brief TCHAR字符串类的声明文件
*
* 本文件完成了对TCHAR字符串类 TString 的定义
*
* @version 2.0
* @author gale
* @date 2007-03-27
*
* Copyright (c) 2007, 5nx.com
* All rights reserved.
*/
#pragma once
#include <tchar.h>
#include <string.h>
#include <Windows.h>
/**
* @brief TCHAR字符串类
*
* 本类完成了TCHAR字符串的常用操作,使用方法和MFC类库的CString类似
*/
class TString
{
protected: // 保护数据
TCHAR* m_pData; //!< C风格字符串,指向本类的实际字符串数据
int m_nSize; //!< 字符串的长度,包括NULL字符
public: // 构造及析构
/**
* @brief 默认构造函数
*
* 当不带任何参数构造类时,使用本构造函数, 如:\n
* TString strTemp;
*
* @return 无
*/
TString()
{
m_nSize = 1;
m_pData = new TCHAR[ 1 ];
m_pData[ 0 ] = _T( '\0' );
}
/**
* @brief 字符参数的构造函数
*
* 用字符参数构造类实例
*
* @param chData 字符
* @return 无
*/
TString( const TCHAR chData )
{
m_nSize = 2;
m_pData = new TCHAR[ 2 ];
m_pData[0] = chData;
m_pData[1] = _T( '\0' );
}
/**
* @brief C风格字符串参数的构造函数
*
* 用C风格字符串参数构造类实例, 如:\n
* TString strTemp( _T( "Temp" );\n
* TString strAbc = _T( "abc" );
*
* @param lpszData C风格字符串
* @return 无
*/
TString( const TCHAR * lpszData )
{
m_nSize = ::_tcslen( lpszData ) + 1;
m_pData = new TCHAR[ m_nSize ];
::_tcscpy( m_pData, lpszData );
}
/**
* @brief 复制构造函数
*
* 使用另一个另实例作为参数生成新的类实例, 如:\n
* TString strTempA = _T( "abc" );\n
* TString strTempB( strTempA );
*
* @param strData 用于复制的类实例
* @return 无
*/
TString( const TString &strData )
{
m_nSize = strData.m_nSize;
m_pData = new TCHAR[ m_nSize ];
::_tcscpy( m_pData, strData.m_pData );
}
/**
* @brief 析构函数
*
* 标准析构函数
*
* @return
*/
~TString( )
{
delete [] m_pData;
m_pData = NULL;
}
public: //重载操作符
/**
* @brief =号操作符重载 ( TString类实例 )
*
* 以本类的另一个实例对本实例赋值, 如:\n
* TString strTempA = _T( "aaa" );\n
* TString strTempB;
* strTempB = strTempA;
*
* @param strData 本类的另一个实例
* @return 实例本身
*/
TString& operator = ( const TString &strData )
{
return *this = strData.m_pData;
}
/**
* @brief =号操作符重载 ( 字符 )
*
* 用字符对本类的实例赋值
*
* @param chData 字符
* @return 实例本身
*/
TString& operator = ( const TCHAR chData )
{
TCHAR szTemp[2];
szTemp[0] = chData;
szTemp[1] = 0;
*this = szTemp;
return *this;
}
/**
* @brief =号操作符重载 ( C风格字符串 )
*
* 用C风格字符串对本类的实例赋值, 如:\n
* TString strTemp;\n
* strTemp = _T( "aaa" );\n
*
* @param lpszData C风格字符串
* @return 实例本身
*/
TString& operator = ( const TCHAR * lpszData )
{
delete [] m_pData;
m_pData = NULL;
m_nSize = ::_tcslen( lpszData ) + 1;
m_pData = new TCHAR[ m_nSize ];
::_tcscpy( m_pData, lpszData );
return *this;
}
/**
* @brief ==操作符重载
*
* 和C风格字符串比较
*
* @param lpszData C风格字符串
* @return 如果和C风格字符串完全相等,返回TRUE,否则,返回FALSE
*/
BOOL operator == ( const TCHAR * lpszData ) const
{
return ::_tcscmp( m_pData, lpszData ) == 0;
}
/**
* @brief !=操作符重载
*
* 和C风格字符串比较
*
* @param lpszData C风格字符串
* @return 如果和C风格字符串不相同,返回TRUE,否则,返回FALSE
*/
BOOL operator != ( const TCHAR * lpszData ) const
{
return ::_tcscmp( m_pData, lpszData ) != 0;
}
/**
* @brief <操作符重载
*
* 和C风格字符串比较, 比较是通过平台的编码完成的,如 ASCII码等, 不同的平台, 可能产生不同的结果
*
* @param lpszData C风格字符串
* @return 如果本实例小于参数提供的字符串,返回TRUE,否则,返回FALSE
*/
BOOL operator < ( const TCHAR * lpszData ) const
{
return ::_tcscmp( m_pData, lpszData ) == -1;
}
/**
* @brief <=操作符重载
*
* 和C风格字符串比较, 比较是通过平台的编码完成的,如 ASCII码等, 不同的平台, 可能产生不同的结果
*
* @param lpszData C风格字符串
* @return 如果本实例小于或等于参数提供的字符串,返回TRUE,否则,返回FALSE
*/
BOOL operator <= ( const TCHAR * lpszData ) const
{
return ::_tcscmp( m_pData, lpszData ) != 1;
}
/**
* @brief >操作符重载
*
* 和C风格字符串比较, 比较是通过平台的编码完成的,如 ASCII码等, 不同的平台, 可能产生不同的结果
*
* @param lpszData C风格字符串
* @return 如果本实例大于参数提供的字符串,返回TRUE,否则,返回FALSE
*/
BOOL operator > ( const TCHAR * lpszData ) const
{
return ::_tcscmp( m_pData, lpszData ) == 1;
}
/**
* @brief >=操作符重载
*
* 和C风格字符串比较, 比较是通过平台的编码完成的,如 ASCII码等, 不同的平台, 可能产生不同的结果
*
* @param lpszData C风格字符串
* @return 如果本实例大于或等于参数提供的字符串,返回TRUE,否则,返回FALSE
*/
BOOL operator >= ( const TCHAR * lpszData ) const
{
return ::_tcscmp( m_pData, lpszData ) != -1;
}
/**
* @brief +操作符重载
*
* 完成和C风格字符串的相加 ( 连接字符串 )
*
* @param lpszData C风格字符串
* @return 相加后的类实例 ( 连接后的字符串 )
*/
TString operator + ( const TCHAR * lpszData ) const
{
TCHAR* szTemp;
szTemp = new TCHAR[ Length() + ::_tcslen( lpszData ) + 1 ];
::_tcscpy( szTemp, m_pData );
::_tcscat( szTemp, lpszData );
TString strTemp( szTemp );
delete [] szTemp;
szTemp = NULL;
return strTemp;
}
/**
* @brief 友员 + 操作符重载( C风格字符串 + TString )
*
* 完成C风格字符串和本类实例的相加
*
* @param lpszLeft C风格字符串
* @param strRight 本类的实例
* @return 相加后的类实例 ( 连接后的字符串 )
*/
friend TString operator + ( TCHAR * lpszLeft, const TString &strRight )
{
TCHAR* szTemp;
szTemp = new TCHAR[ strRight.Length() + ::_tcslen( lpszLeft ) + 1 ];
::_tcscpy( szTemp, lpszLeft ) ;
::_tcscat( szTemp, strRight.m_pData );
TString strTemp( szTemp );
delete [] szTemp;
szTemp = NULL;
return strTemp;
}
/**
* @brief +=操作符重载
*
* 将另一个字符串连接到本串的尾部 ( 连接字符串 )
*
* @param lpszData C风格字符串
* @return 连接后的类实例 ( 连接后的字符串 )
*/
void operator += ( const TCHAR * lpszData )
{
*this = *this + lpszData;
}
public: // 子串操作
/**
* @brief 取子字符串
*
* 在指定位置提取指定长度的子字符串
*
* @param nIndex 子字符串的开始位置
* @param nCount 子字符串的长度
* @return 子字符串
*/
TString SubStr( int nIndex, int nCount ) const
{
TString strTmp;
// 判断传入的子字符串的开始位置是否有效 :
if ( ( nIndex < 0 ) || ( nIndex >= m_nSize - 1 ) )
{
return strTmp;
}
// 结束 ( 判断传入的子字符串的开始位置是否有效 )
TCHAR* s = new TCHAR[ nCount + 1 ];
::memset( s, 0, ( nCount + 1 ) * sizeof( TCHAR ) );
_tcsncpy( s, m_pData + nIndex, nCount );
strTmp = s;
delete [] s;
s = NULL;
return strTmp;
}
/**
* @brief 插入子字符串
*
* 在指定位置插入一个子字符串
*
* @param lpszData 要插入的子字符串
* @param nIndex 插入的位置
* @return 无
*/
void Insert( const TCHAR * lpszData, int nIndex )
{
// 判断传入的插入的位置是否有效 :
if ( ( nIndex < 0 ) || ( nIndex >= m_nSize ) )
{
return;
}
// 结束 ( 判断传入的子字符串的开始位置是否有效 )
TString strTemp( m_pData );
*this = strTemp.SubStr( 0, nIndex );
*this += lpszData;
*this += strTemp.SubStr( nIndex, 1024 * 1024 );
}
/**
* @brief 删除子字符串
*
* 在指定位置删除指定长度的子字符串
*
* @param nIndex 要删除子串的起始位置
* @param nCount 要删除子串的长度
* @return 无
*/
void Remove( int nIndex, int nCount )
{
// 判断传入的要删除子串的起始位置是否有效 :
if ( ( nIndex < 0 ) || ( nIndex >= m_nSize - 1 ) )
{
return;
}
// 结束 ( 判断传入的要删除子串的起始位置是否有效 )
TString strTemp( m_pData );
*this = strTemp.SubStr( 0, nIndex
- 1
- 2
前往页