//===============================寫在前面=============================== 在標準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); } */