數值和字符的轉換一直是C++的弱項,C++只提供來自C語言的單向不安全轉換。
(C語言中,atoi函數和atof函數能夠把字符串轉換爲數值,但沒有反轉函數)
如若要反轉,只能用不安全的printf().
雖然不少編譯器額外提供反向轉換(如itoa,_itoa函數),但也是至關不安全。ios
所以我開發了一個能夠安全的雙向轉換的庫以備使用。安全
庫文件下載:
http://pan.baidu.com/netdisk/singlepublic?fid=199923_3319019563
http://dl.dbank.com/c0eaq7aa8b
文件列表:
TYSafeCast.h
TYSafeCast10.dll
TYSafeCast10.lib
TYSafeCast10d.dll
TYSafeCast10d.lib
TYSafeCast.def
msvcp100.dll
msvcr100.dll
msvcp100d.dll
msvcr100d.dll函數
/*- ========================================================== * 文件名 :TYSafeCast.h * 開發人員:袁培榮 * 當前版本:1.0.0.2595 * 建立時間:2012-05-31 * 修改時間:2012-05-31 * 功能說明:安全的類型轉換擴展 * 版權說明:版權全部 袁培榮 YuanPeirong * 編譯環境:Windows 7(x64) SP1 簡體中文專業版 * 編譯器: Visual Studio 2010 SP1(中文旗艦版) MinGW 20120426 GNU GCC 4.6.2 Visual C++ 6.0 SP6(中文企業版) - ==========================================================*/ #ifndef SafeCast_H_TYCppStdLib #define SafeCast_H_TYCppStdLib #ifdef SafeCast_DLL_API #else #define SafeCast_DLL_API _declspec(dllimport) #endif #include <string> using namespace std; namespace TYCppStdLib { template<typename T> class CCast { public: T value; bool castOK; }; typedef CCast<int> CCastInt; typedef CCast<long> CCastLong; typedef CCast<float> CCastFloat; typedef CCast<double> CCastDouble; typedef CCast<string> CCastString; //================================================ // 如下16個函數用於字符串和數值的相互轉換 // 字符串能夠是: // 字面值常量,char*, const char*, string,const string共五種 // 數值能夠是: // int,long,float,double共四種(對於其餘均可以先轉爲此四種之一) // 對於不帶Ex後綴的版本,直接返回轉換後的值, // 若轉換失敗,對字符串,返回空字符串,對數值,返回0 // 對於帶Ex後綴的版本,返回相應類的對象 // 其value變量保存轉換後的值 // 若轉換失敗,對字符串,value爲空字符串,對數值,value爲0 // 其castOK變量保存轉換信息 // 若轉換成功 castOK爲true,反之爲false SafeCast_DLL_API int SCastInt(const string &str); SafeCast_DLL_API CCastInt SCastIntEx(const string &str); SafeCast_DLL_API long SCastLong(const string &str); SafeCast_DLL_API CCastLong SCastLongEx(const string &str); SafeCast_DLL_API float SCastFloat(const string &str); SafeCast_DLL_API CCastFloat SCastFloatEx(const string &str); SafeCast_DLL_API double SCastDouble(const string &str); SafeCast_DLL_API CCastDouble SCastDoubleEx(const string &str); SafeCast_DLL_API string ICastString(int n); SafeCast_DLL_API CCastString ICastStringEx(int n); SafeCast_DLL_API string LCastString(long n); SafeCast_DLL_API CCastString LCastStringEx(long n); SafeCast_DLL_API string FCastString(float n); SafeCast_DLL_API CCastString FCastStringEx(float n); SafeCast_DLL_API string DCastString(double n); SafeCast_DLL_API CCastString DCastStringEx(double n); //================================================ } #endif
/*- ========================================================== * 文件名 :TestTYSafeCast.cpp * 開發人員:袁培榮 * 當前版本:1.0.0.2595 * 建立時間:2012-05-31 * 修改時間:2012-05-31 * 功能說明:安全的類型轉換擴展 使用示例 * 版權說明:版權全部 袁培榮 YuanPeirong * 編譯環境:Windows 7(x64) SP1 簡體中文專業版 * 編譯器: Visual Studio 2010 SP1(中文旗艦版) MinGW 20120426 GNU GCC 4.6.2 Visual C++ 6.0 SP6(中文企業版) - ==========================================================*/ #include <iostream> #include "TYSafeCast.h" #pragma comment(lib, "TYSafeCast10.lib") //#include <string> //已經包含在SafeCast.h中 using namespace std; using namespace TYCppStdLib; //在Debug模式下,請確保系統有msvcp100d.dll和msvcr100d.dll兩個運行庫 //在Release模式下,請確保系統有msvcp100.dll和msvcr100.dll兩個運行庫 //例如在Release模式下,本示例編譯成功可執行文件TestTYSafeCast.exe //那麼,此文件如要運行,就必須在同目錄下有以下三個文件: // TYSafeCast10.dll msvcp100.dll msvcr100.dll //或者 int main(int argc, char* argv[]) { string str="123"; char *pch=static_cast<char*>("321"); const string str2="123"; const char *pch2="321"; cout<<"全面測試FCastInt"<<endl; cout<<SCastInt("500")<<endl; cout<<SCastInt(str)<<endl; cout<<SCastInt(pch)<<endl; cout<<SCastInt(str2)<<endl; cout<<SCastInt(pch2)<<endl; cout<<"全面測試FCastIntEx"<<endl; cout<<"對str=\"123\""<<endl; CCastInt mycast; mycast=SCastIntEx(str); if(mycast.castOK) cout<<"str轉換成功:"<<mycast.value<<endl; else cout<<"str轉換失敗:"<<mycast.value<<endl; str="123A"; cout<<"對str=\"123A\""<<endl; mycast=SCastIntEx(str); if(mycast.castOK) cout<<"str轉換成功:"<<mycast.value<<endl; else cout<<"str轉換失敗:"<<mycast.value<<endl; string si="100"; string sl="200000"; string sf="3.14"; string sd="3.1415926"; cout<<"測試數值變量轉string(無Ex)"<<endl; cout<<SCastInt(si)<<endl; cout<<SCastLong(sl)<<endl; cout<<SCastFloat(sf)<<endl; cout<<SCastDouble(sd)<<endl; cout<<"測試數值常量轉string(無Ex)"<<endl; cout<<SCastInt("100")<<endl; cout<<SCastLong("200000")<<endl; cout<<SCastFloat("3.14")<<endl; cout<<SCastDouble("3.1415926")<<endl; cout<<"測試數值變量轉string(有Ex)"<<endl; cout<<SCastIntEx(si).value<<endl; cout<<SCastLongEx(sl).value<<endl; cout<<SCastFloatEx(sf).value<<endl; cout<<SCastDoubleEx(sd).value<<endl; cout<<"測試數值常量轉string(有Ex)"<<endl; cout<<SCastIntEx("100").value<<endl; cout<<SCastLongEx("200000").value<<endl; cout<<SCastFloatEx("3.14").value<<endl; cout<<SCastDoubleEx("3.1415926").value<<endl; int i=100; long l=200000; float f=3.14; double d=3.1415926; cout<<"測試string轉數值變量(無Ex)"<<endl; cout<<ICastString(i)<<endl; cout<<LCastString(l)<<endl; cout<<FCastString(f)<<endl; cout<<DCastString(d)<<endl; cout<<"測試string轉數值常量(無Ex)"<<endl; cout<<ICastString(100)<<endl; cout<<LCastString(200000)<<endl; cout<<FCastString(3.14)<<endl; cout<<DCastString(3.1415926)<<endl; cout<<"測試string轉數值變量(有Ex)"<<endl; cout<<ICastStringEx(i).value<<endl; cout<<LCastStringEx(l).value<<endl; cout<<FCastStringEx(f).value<<endl; cout<<DCastStringEx(d).value<<endl; cout<<"測試string轉數值常量(有Ex)"<<endl; cout<<ICastStringEx(100).value<<endl; cout<<LCastStringEx(200000).value<<endl; cout<<FCastStringEx(3.14).value<<endl; cout<<DCastStringEx(3.1415926).value<<endl; return 0; } //============= //運行結果: //============= // 全面測試FCastInt // 500 // 123 // 321 // 123 // 321 // 全面測試FCastIntEx // 對str="123" // str轉換成功:123 // 對str="123A" // str轉換失敗:0 // 測試數值變量轉string(無Ex) // 100 // 200000 // 3.14 // 3.14159 // 測試數值常量轉string(無Ex) // 100 // 200000 // 3.14 // 3.14159 // 測試數值變量轉string(有Ex) // 100 // 200000 // 3.14 // 3.14159 // 測試數值常量轉string(有Ex) // 100 // 200000 // 3.14 // 3.14159 // 測試string轉數值變量(無Ex) // 100 // 200000 // 3.1400001 // 3.1415926000000001 // 測試string轉數值常量(無Ex) // 100 // 200000 // 3.1400000000000001 // 3.1415926000000001 // 測試string轉數值變量(有Ex) // 100 // 200000 // 3.1400001 // 3.1415926000000001 // 測試string轉數值常量(有Ex) // 100 // 200000 // 3.1400000000000001 // 3.1415926000000001 //=============