厚積薄發—C++標準庫string類的擴展(暫行稿)

//===============================寫在前面===============================
在標準C++中,有兩種形式的字符:
分別是C語言的C風格字符串和C++標準庫中的string類。

其中C風格的字符串以字符數組 char*或者char[]來實現,
可是功能很弱,並且很不安全。

標準C++採用類模板的形式來封裝字符串,建議使用。

頭文件說明:

C風格字符串: 
#include <string.h> //這是C語言和非標準C++用的老式的頭文件
#include <cstring>  //這是標準C++用的新式的頭文件
//string.h和cstring在功能上基本相似
//只是後者的內容都放在命名空間std中

標準C++的string類頭文件
#include <string> //全部內容放在命名空間std中

注1:
    string.h和cstring基本相同,後者是前者的替代版本。
    可是和string徹底是兩個不一樣的頭文件。

注2:在MFC中還有一個功能更強大的類CString類來處理字符串
//==========================================================================
通過多日準備,如今發佈我寫的C++標準庫string類的擴展stringEx類(暫時稿)
之因此稱爲暫行稿的緣由:
1.
  如今發佈的功能還比較少,有待增長
2.
  stringEx直接將string的對象做爲成員變量進行string類的擴展,
  這種作法是正確的,可是,卻不是很好,所以只是暫行。
  我寫的C++代碼不但要正確,更要追求C++標準,還要符合高級的C++編程規範。
  雖然不標準和不和高級規範都是正確的,但不能讓我知足。
3.
  C++的高級編程規範向程序員建議:不要將基類的對象做爲派生類的成員變量。
//==========================================================================

源代碼以下:

/*- ==========================================================
*     文件名  :stringEx.h
*     開發人員:袁培榮
*     當前版本:1.0.0.2595
*     建立時間:2012-04-22
*     修改時間:2012-05-08
*     功能說明:C++標準庫string類的擴展(暫行稿)
*     版權說明:版權全部 袁培榮 YuanPeirong 
*     編譯環境:Windows 7(x64) SP1 簡體中文專業版
*     編譯器:  Visual Studio 2010 SP1(中文旗艦版)
				MinGW 2011118
				Visual C++ 6.0 SP6(中文企業版)
- ==========================================================*/

#ifndef stringEx_H_TYCppStdLib
#define stringEx_H_TYCppStdLib

#ifdef stringEx_DLL_API
#else
#define stringEx_DLL_API _declspec(dllimport)
#endif

#include <string>

using std::string;

namespace TYCppStdLib
{   
	class stringEx_DLL_API stringEx : public string
	{
	private:
		string m_strEx;
	public:
		//構造函數
		
		    //爲本類和基類共同構造
		stringEx();		
		    //爲本類構造
		stringEx(string str);       
		    //爲基類string構造
		stringEx(const char *str);  
		stringEx(size_type length, char ch);                      
		stringEx(const char *str, size_type length);              
		stringEx(string &str, size_type index, size_type length); 
		stringEx(const_iterator start, const_iterator end);
		
		//虛析構函數
		virtual ~stringEx();

		//同步對象自己和m_strEx的值
		void Synchronous(bool positive=true); 

		//獲取m_strEx
		string GetString();
		void GetString(string &getString);
		
		//設置m_strEx
		void SetString(string setString);
		
		//內聯函數(是否數字,字母轉大寫,字母轉小寫)
		inline bool IsDigitInline(char *buf)
		{
		    return((*buf & 0x10) ? 1 : (*buf =='.'));
		}
		inline char CharToUpperInline(unsigned char c)
		{
		    return ((c >= 'a' && c <= 'z') ? c-('a'-'A') : c );
		}
		inline char CharToLowerInline(unsigned char c)
		{
		    return ((c >= 'A' && c <= 'Z') ? c+('a'-'A') : c );
		}
		
		// bool IsDigit(char *buf);
		// char CharToUpper(unsigned char c);
		// char CharToLower(unsigned char c);
		
		//判斷字符串是否是數字
		bool IsNumeric();
		bool IsNumeric(string stString);
		bool IsNumeric(string *stString);
		//bool IsNumeric(string &stString);
		
		//字符串中全部字母轉爲大寫形式
		string Upcase(bool UpMe=false);
		string Upcase(string stString);
		void Upcase(string *stString);
		//void Upcase(string &stString);
		
		//字符串中全部字母轉爲小寫形式
		string Lowercase(bool LowMe=false);
		string Lowercase(string stString);
		void Lowercase(string *stString);
		//void Lowercase(string &stString);

		//去掉左邊指定字符串
		string LTrim(bool LTrMe=false, string LTrStr=" ");
		string LTrim(string stString, string LTrStr=" ");
		void LTrim(string *stString, string LTrStr=" ");
		//void LTrim(string &stString, string LTrStr=" ");

		//去掉右邊指定字符串
		string RTrim(bool RTrMe=false, string RTrStr=" ");
		string RTrim(string stString, string RTrStr=" ");
		void RTrim(string *stString, string RTrStr=" ");
		//void RTrim(string &stString, string RTrStr=" ");
		
		//去掉兩邊指定字符串
		string Trim(bool TrMe=false, string TrStr=" ");
		string Trim(string stString, string TrStr=" ");
		void Trim(string *stString, string TrStr=" ");
		//void Trim(string &stString, string TrStr=" ");
	};
}

#endif

/*- ==========================================================
*     文件名  :stringEx.cpp
*     開發人員:袁培榮
*     當前版本:1.0.0.2595
*     建立時間:2012-04-22
*     修改時間:2012-05-08
*     功能說明:C++標準庫string類的擴展(暫行稿)
*     版權說明:版權全部 袁培榮 YuanPeirong 
*     編譯環境:Windows 7(x64) SP1 簡體中文專業版
*     編譯器:  Visual Studio 2010 SP1(中文旗艦版)
                MinGW 2011118
                Visual C++ 6.0 SP6(中文企業版)
- ==========================================================*/

#ifndef stringEx_DLL_ForAPI
#define stringEx_DLL_ForAPI

#define stringEx_DLL_API _declspec(dllexport)

#endif

//#include "../../Include/stringEx.h"

//構造函數
TYCppStdLib::stringEx::stringEx()
{
    m_strEx="";
}

TYCppStdLib::stringEx::stringEx(string str)
{
    m_strEx=str;
	//m_strEx.assign(str);
	*this=m_strEx;
}

TYCppStdLib::stringEx::stringEx(const char *str ):string(str)
{
    m_strEx=*this;
}

TYCppStdLib::stringEx::stringEx(
	size_type length, 
	char ch
	):string(length, ch)
{
    m_strEx=*this;
}

TYCppStdLib::stringEx::stringEx(
	const char *str, 
	size_type length
	):string(str, length)
{
    m_strEx=*this;
}

TYCppStdLib::stringEx::stringEx(
	string &str, 
	size_type index, 
	size_type length
	):string(str, index, length)
{
    m_strEx=*this;
}

TYCppStdLib::stringEx::stringEx(
	const_iterator start, 
	const_iterator end
	):string(start, end)
{
    m_strEx=*this;
}

//虛析構函數
TYCppStdLib::stringEx::~stringEx()
{
    //空函數
}

//同步對象自己和m_strEx的值
void TYCppStdLib::stringEx::Synchronous(bool positive)
{
    if(true==positive)
        m_strEx=*this;
	else
	    *this=m_strEx;
}

//獲取m_strEx
string TYCppStdLib::stringEx::GetString()
{
    string getString=m_strEx;
	return getString;
}

void TYCppStdLib::stringEx::GetString(string &getString)
{
    getString=m_strEx;
	//getString.assign(m_strEx);
}

//設置m_strEx
void TYCppStdLib::stringEx::SetString(string setString)
{
    m_strEx=setString;
	//m_strEx.assign(setString);
	Synchronous(false);
}

//判斷字符串是否是數字
bool TYCppStdLib::stringEx::IsNumeric()
{
    if(""==m_strEx)
	    return false;
	char chTemp;
	for(unsigned int i=0; i < m_strEx.length(); i++ )    
	{
		strcpy(&chTemp,m_strEx.substr(i,1).c_str());
		if(!IsDigitInline(&chTemp))
			return false;
	}
	return true;
}

bool TYCppStdLib::stringEx::IsNumeric(string stString)
{
    if(""==stString)
	    return false;
	char chTemp;
	for(unsigned int i=0; i < stString.length(); i++ )    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		if(!IsDigitInline(&chTemp))
			return false;
	}
	return true;
}

bool TYCppStdLib::stringEx::IsNumeric(string *stString)
{
    if(""==(*stString))
	    return false;
	char chTemp;
	for(unsigned int i=0; i < stString->length(); i++ )    
	{
		strcpy(&chTemp,stString->substr(i,1).c_str());
		if(!IsDigitInline(&chTemp))
			return false;
	}
	return true;
}

/* bool TYCppStdLib::stringEx::IsNumeric(string &stString)
{
    if(""==stString)
	    return false;
	char chTemp;
	for(unsigned int i=0; i < stString.length(); i++ )    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		if(!IsDigitInline(&chTemp))
			return false;
	}
	return true;
} */

//字符串中全部字母轉爲大寫形式
string TYCppStdLib::stringEx::Upcase(bool UpMe)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<m_strEx.size(); i++)    
	{
		strcpy(&chTemp,m_strEx.substr(i,1).c_str());
		stTemp += CharToUpperInline(chTemp);   
	}
	if(true==UpMe)
	{
	    m_strEx=stTemp;
		Synchronous(false);
	}
	return stTemp;
}

string TYCppStdLib::stringEx::Upcase(string stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString.size(); i++)    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		stTemp += CharToUpperInline(chTemp);   
	}
	return stTemp;
}

void TYCppStdLib::stringEx::Upcase(string *stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString->size(); i++)    
	{
		strcpy(&chTemp,stString->substr(i,1).c_str());
		stTemp += CharToUpperInline(chTemp);   
	}
	*stString=stTemp;
}

/* void TYCppStdLib::stringEx::Upcase(string &stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString.size(); i++)    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		stTemp += CharToUpperInline(chTemp);   
	}
	stString=stTemp;
} */

//字符串中全部字母轉爲小寫形式
string TYCppStdLib::stringEx::Lowercase(bool LowMe)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<m_strEx.size(); i++)    
	{
		strcpy(&chTemp,m_strEx.substr(i,1).c_str());
		stTemp += CharToLowerInline(chTemp);   
	}
	if(true==LowMe)
	{
	    m_strEx=stTemp;
		Synchronous(false);
	}
	return stTemp;
}

string TYCppStdLib::stringEx::Lowercase(string stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString.size(); i++)    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		stTemp += CharToLowerInline(chTemp);   
	}
	return stTemp;
}

void TYCppStdLib::stringEx::Lowercase(string *stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString->size(); i++)    
	{
		strcpy(&chTemp,stString->substr(i,1).c_str());
		stTemp += CharToLowerInline(chTemp);   
	}
	*stString=stTemp;
}

/* void TYCppStdLib::stringEx::Lowercase(string &stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString.size(); i++)    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		stTemp += CharToLowerInline(chTemp);   
	}
	stString=stTemp;
} */

//去掉左邊指定字符串
string TYCppStdLib::stringEx::LTrim(bool LTrMe, string LTrStr)
{
	string stTemp=m_strEx;
	if (!stTemp.length()) 
	    return stTemp;
	int i=0;	
	string buf;
	while (stTemp.substr(i,1) == LTrStr)
		i++;
	if(0==i)
	    return stTemp;
	if (i == stTemp.length())
	{
		stTemp = "";
		return stTemp;
	}
    stTemp = stTemp.substr(i,stTemp.length()-i);
	if(true==LTrMe)
	{
	    m_strEx=stTemp;
		Synchronous(false);
	}
	return stTemp;
}

string TYCppStdLib::stringEx::LTrim(string stString, string LTrStr)
{
	string stTemp=stString;
	if (!stTemp.length()) 
	    return stTemp;
	int i=0;	
	string buf;
	while (stTemp.substr(i,1) == LTrStr)
		i++;
	if(0==i)
	    return stTemp;
	if (i == stTemp.length())
	{
		stTemp = "";
		return stTemp;
	}
    stTemp = stTemp.substr(i,stTemp.length()-i);
	return stTemp;
}

void TYCppStdLib::stringEx::LTrim(string *stString, string LTrStr)
{
	if (!stString->length()) 
	    return;
	int i=0;	
	string buf;
	while (stString->substr(i,1) == LTrStr)
		i++;
	if(0==i)
	    return;
	if (i == stString->length())
	{
		*stString = "";
		return;
	}
    *stString = stString->substr(i,stString->length()-i);
}

/* void TYCppStdLib::stringEx::LTrim(string &stString, string LTrStr)
{
	if (!stString.length()) 
	    return;
	int i=0;	
	string buf;
	while (stString.substr(i,1) == LTrStr)
		i++;
	if(0==i)
	    return;
	if (i == stString.length())
	{
		stString = "";
		return;
	}
    stString = stString.substr(i,stString.length()-i);
} */

//去掉右邊指定字符串
string TYCppStdLib::stringEx::RTrim(bool RTrMe, string RTrStr)
{
    string stTemp=m_strEx;
	if (!stTemp.length())
		return stTemp;
    int i;
	i = stTemp.length()-1;
	while (stTemp.substr(i,1) == RTrStr)
	{
		stTemp = stTemp.substr(0, i);	
		i--;
	}
	if(true==RTrMe)
	{
	    m_strEx=stTemp;
		Synchronous(false);
	}
	return stTemp;
}

string TYCppStdLib::stringEx::RTrim(string stString, string RTrStr)
{
    string stTemp=stString;
	if (!stTemp.length())
		return stTemp;
    int i;
	i = stTemp.length()-1;
	while (stTemp.substr(i,1) == RTrStr)
	{
		stTemp = stTemp.substr(0, i);	
		i--;
	}
	return stTemp;
}

void TYCppStdLib::stringEx::RTrim(string *stString, string RTrStr)
{
	if (!stString->length())
		return;
    int i;
	i = stString->length()-1;
	while (stString->substr(i,1) == RTrStr)
	{
		*stString = stString->substr(0, i);	
		i--;
	}
}

/* void TYCppStdLib::stringEx::RTrim(string &stString, string RTrStr)
{
	if (!stString.length())
		return;
    int i;
	i = stString.length()-1;
	while (stString.substr(i,1) == RTrStr)
	{
		stString = stString.substr(0, i);	
		i--;
	}
} */

//去掉兩邊指定字符串
string TYCppStdLib::stringEx::Trim(bool TrMe, string TrStr)
{
	string stTemp=m_strEx;
	stTemp=RTrim(stTemp, TrStr);
	if (stTemp.length())
	stTemp=LTrim(stTemp, TrStr);
	if(true==TrMe)
	{
		m_strEx=stTemp;
		Synchronous(false);
	}
	return stTemp;
}

string TYCppStdLib::stringEx::Trim(string stString, string TrStr)
{
	string stTemp=stString;
	stTemp=RTrim(stTemp, TrStr);
	if (stTemp.length())
	stTemp=LTrim(stTemp, TrStr);
	return stTemp;
}

void TYCppStdLib::stringEx::Trim(string *stString, string TrStr)
{
	RTrim(stString, TrStr);
	if (stString->length())
	LTrim(stString, TrStr);
}

/* void TYCppStdLib::stringEx::Trim(string &stString, string TrStr)
{
	RTrim(stString, TrStr);
	if (stString.length())
		LTrim(stString, TrStr);
} */
相關文章
相關標籤/搜索