C++字符串與數值——安全的類型轉換擴展

數值和字符的轉換一直是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
//=============
相關文章
相關標籤/搜索