類型轉換總結(CString 、char*、int、float、_bstr_t、LPCWSTR、LPSTR)

http://blog.csdn.net/lebao82/article/details/7903827

1、CString轉char*

CString 頭文件#include <afx.h>

CString cstr;

char *p = (LPSTR)(LPCTSTR)cstr;


2、CString轉_bstr_t

CString   cs= "aaa ";   
_bstr_t   bstr   =   (LPCTSTR)cs   ;


3、CString轉LPCWSTR

兩者的不同:LPCWSTR 是Unicode字符串指針,初始化時串有多大,申請空間就有多大,以後存貯若超過則出現無法預料的結果,這是它與CString的不同之處。而CString是一個串類,內存空間類會自動管理。

    CString轉換成LPCWSTR

    方法一:CString strFileName;

                     LPCWSTR lpcwStr = strFileName.AllocSysString();

    方法二:CString str=_T("TestStr"); 

                    USES_CONVERSION; 
                    LPCWSTR lpcwStr = A2CW((LPCSTR)str); //CW2A將寬字符集(Unicode)轉化爲多字符集(ASCII)
                                                                                    //CA2W就是反過來轉換了
                                                                                   //A2CW表示(LPCSTR)  -> (LPCWSTR)
    CString str(lpcwStr);    MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR)  -> (LPCWSTR),USER_CONVERSION表示用來定義一些中間變量,在使用ATL的轉換宏之前必須定義該語句。

    LPCWSTR轉換成CString

    LPCWSTR lpcwStr = L"TestWStr"; 

4、CString與LPSTR轉換

     CString轉換成LPSTR:

    方法一:CString strFileName;

                    LPSTR lpStr = strFileName.GetBuffer();

                    strFileName.ReleaseBuffer();

     方法二:CString strFileName;

                     LPSTR lpStr = (LPSTR)(LPCSTR)strFimeName;

      LPSTR轉換成CString:

                      LPSTR lpStr = L"TestStr"; 
                      CString str(lpStr);

      注意:CString和LPCSTR可直接轉換,如下:

                     CString str;

                     LPCSTR lpcStr = (LPCSTR)str;

5、CString和char*轉換

       CString轉換成char*
       方法一:CString str;
                       char* p = str.GetBuffer();
       方法二:CString str;
                       char* p = (LPSTR)(LPCSTR)str;
       char*轉換成CString
                       char* p = "test";
                       CString str = ("%s",p);

6、String和int、float的轉換

        可以使用atoi,atof,atol等函數來完成。

7、LPSTR(char*)和LPWSTR的轉換

        可以使用下面的ATL宏來進行,最好是將變量定義成TCHAR、LPTSTR等T類型,可以避免轉換。

8、CString轉BYTE

       BYTE bText;

       CString str;

       bText = str.GetAt(n);

 

ATL宏介紹:

     A2BSTR   OLE2A             T2A            W2A 
     A2COLE   OLE2BSTR    T2BSTR    W2BSTR 
     A2CT         OLE2CA         T2CA          W2CA 
     A2CW        OLE2CT         T2COLE    W2COLE 
     A2OLE       OLE2CW       T2CW         W2CT 
     A2T            OLE2T            T2OLE        W2OLE 
     A2W           OLE2W          T2W             W2T

    A :ANSI 字符串,也就是 MBCS。 
    W、OLE 寬字符串,也就是 UNICODE。 
    T 中間類型T。如果定義了 _UNICODE,則T表示W;如果定義了 _MBCS,則T表示A 
    C const 的縮寫

利用這些宏,可以快速的進行各種字符間的轉換。使用前必須包含頭文件,並且申明USER_CONVERSION;使用 ATL 轉換宏,由於不用釋放臨時空間,所以使用起來非常方便。但是考慮到棧空間的尺寸(VC 默認2M),使用時要注意幾點:

    1、只適合於進行短字符串的轉換; 
    2、不要試圖在一個次數比較多的循環體內進行轉換; 
    3、不要試圖對字符型文件內容進行轉換,因爲文件尺寸一般情況下是比較大的; 
    4、對情況 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

void Func1(LPSTR lpStr);

void Func2(LPWSTR lpwStr);

TCHAR   name[256];

TCHAR*   pName = new  TCHAR[256];

Func1(name); // Func1(pName);

Func2(name); // Func2(pName);

注意在VS2005中上面用紅色標記的代碼已經不成立。

VS2005中CString已經改爲寬字符型,一些轉換如下:

char name[10];
 TCHAR sex[5] ;
 char *p = name;
 TCHAR *pw = sex;

 LPSTR lpstr = name;
 LPCSTR lpcstr = name;
 lpcstr = lpstr;
 
 lpstr = p;
 p = (char*)sex;
 pw = (WCHAR*)name;
 LPWSTR lpwstr = (LPWSTR)lpstr;
 lpwstr = (LPWSTR)lpcstr;
 LPCWSTR lpcwstr = (LPCWSTR)lpstr;
 lpcwstr = (LPCWSTR)name;

 CString str(lpstr);
 CString str1(lpcstr);
 CString str2(lpwstr);
 CString str3(lpcwstr);
 CString str4(name);
 CString str5(sex);

 lpwstr = (LPWSTR)(LPCWSTR)str;
 lpstr = (LPSTR)(LPCWSTR)str;
 lpcstr = (LPCSTR)(LPCWSTR)str;

 p = (char*)str.GetBuffer();
 pw = str.GetBuffer();

可以看出轉換更加簡單了,基本上可以直接轉換,A2W等宏基本上不需要啦。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章