天天看點

CString、LPCTSTR、LPTSTR、TCHAR、WCHAR、string、wchar_t、char解析

CString->TCHAR*的轉化可以用函數GetBuff()

函數原型為:LPTSTR GetBuffer( int nMinBufLength );

CString str("CString");

 TCHAR* szMsg = new TCHAR[100];

 //其參數為CString字元串的長度

 szMsg = str.GetBuffer(str.GetLength());

 str.ReleaseBuffer();

 delete []szMsg;

 szMsg = NULL;

TCHAR*->CString的轉化

TCHAR szTchar[18] = L"TCHAR";   

 CString  str;   

 str.Format(_T("%s"),szTchar);  

一.類型簡介

1.CString:動态的TCHAR數組。它是一個完全獨立的類,封裝了“+”等操作符和字元串操作方法,換句話說就是CString是對TCHAR操作的方法的集合。

2.LPCTSTR:常量的TCHAR指針,其定義為

    typedef const TCHAR* LPCTSTR

其中

     L表示long指針 這是為了相容Windows 3.1等16位作業系統遺留下來的,在win32中以及其他的32位作業系統中, long指針和near指針及far修飾符都

       是為了相容的作用。沒有實際意義。

P表示這是一個指針

C表示是一個常量

T表示在Win32環境中, 有一個_T宏

STR表示這個變量是一個字元串

2.LPTSTR:TCHAR指針,其定義為

    typedef TCHAR* LPTSTR

L、P、T的含義同上。

3.TCHAR:TCHAR其實是一個宏,其定義為:

    #ifdef UNICODE

    typedef wchar_t TCHAR;

    #else

    typedef char TCHAR;

    #endif

也就是說,如果我們使用unicode編碼,那麼TCHAR指的就是wchat_t,如果我們使用的是ASCII編碼,那麼TCHAR指的就是char,這樣處理的目的是為了程式的可移植性。T表示在Win32環境中, 有一個_T宏。

4.WCHAR:WCHAR其實也是一個宏,表示的就是wchar_t,為了書寫友善重新定義的一個宏而已,其定義為:

    typedef wchar_t WCHAR

5.string:string是c++中的字元串變量,因為操作c類型的char非常麻煩,而且很容易出現記憶體洩漏,是以c++就對c中的char 進行了封裝,其中

    包含了指派、删除、增加等常用操作,這些操作都不用考慮記憶體,是的使用更加友善,是以能使用string就盡量使用string,使用string要包含其頭檔案:

    #include <string>

    注意不是:

    #include <string.h>

因為string.h是C字元串頭檔案。

string中常用的函數有:

    a) =,assign()   //賦以新值

    b) swap()   //交換兩個字元串的内容

    c) +=,append(),push_back() //在尾部添加字元

    d) insert() //插入字元

    e) erase() //删除字元

    f) clear() //删除全部字元

    g) replace() //替換字元

    h) + //串聯字元串

    i) ==,!=,<,<=,>,>=,compare()  //比較字元串

    j) size(),length()  //傳回字元數量

k) max_size() //傳回字元的可能最大個數

    l) empty()  //判斷字元串是否為空

    m) capacity() //傳回重新配置設定之前的字元容量

    n) reserve() //保留一定量記憶體以容納一定數量的字元

    o) [ ], at() //存取單一字元

    p) >>,getline() //從stream讀取某值

    q) <<  //将謀值寫入stream

    r) copy() //将某值指派為一個C_string

    s) c_str() //将内容以C_string傳回

    t) data() //将内容以字元數組形式傳回

    u) substr() //傳回某個子字元串

    v)查找函數

    w)begin() end() //提供類似STL的疊代器支援

    x) rbegin() rend() //逆向疊代器

    y) get_allocator() //傳回配置器

    6.wchar_t:wchar_t是c++中用來表示寬位元組的資料類型,即unicode編碼的資料類型。

    7.char:char是c中的字元資料類型,屬于ASCII編碼。

    下面是msdn上給出的定義:

01  type                Meaning in MBCS builds          Meaning in Unicode builds

02   

03  WCHAR                 wchar_t                             wchar_t

04  LPSTR                 char*                               char*

05  LPCSTR                const char*                         const char*

06  LPWSTR                wchar_t*                            wchar_t*

07  LPCWSTR               const wchar_t*                      const wchar_t* 

08  TCHAR                 char                                wchar_t

09  LPTSTR                TCHAR*                              TCHAR*

10  LPCTSTR               const TCHAR*                        const TCHAR*

二.互相轉化

1   既然有定義了這麼多的資料類型,是以他們之間的互相轉化是少不了的。

    A):CString的轉化

    1.CString和LPCTSTR的轉化:

    CString和LPCTSTR不需要轉化,兩者是等價的,是以:

    CString str("cstring");

    LPCTSTR pcStr = str;

2.CString和LPTSTR的轉化:

下述轉法雖然可以,但是卻不安全:

    CString str("string");

    LPTSTR pStr = (LPTSTR)(LPCTSTR)(str);

因為本來轉化後的字元串變得可以修改了,造成了安全隐患。

正确的轉化方法為:

    LPTSTR pStr = str.GetBuffer();

    str.ReleaseBuffer();

    注意:GetBuffer()和ReleaseBuffer()之間不可以調用任何的CString函數,比如GetLength()函數,因為無法預測對記憶體的操作,是以任何CString函數得到的結果都是不确定的。

3.CString和WCHAR*(wchar_t*)的轉化

方法一:使用wcscpy()函數

    WCHAR pWchar[100];

    wcscpy(pWchar,str);

方法二:使用wcscpy_s()函數

這個函數是上一個函數的安全版本,調用上一個函數如果pWchar的記憶體不足時,容易引發意味的錯誤,但是wcscpy_s()則不會,應該其記憶體大小已經指定出來了:

    wcscpy(pWchar,100,str);

方法三:使用_tcscpy()函數

    WCHAR pStr[100];

    _tcscpy(pStr,str);

方法四:使用_tcscpy_s()函數

同wcscpy_s()一樣,_tcscpy_s()函數也是_tcscpy()函數的安全版本:

    _tcscpy_s(pStr,100,str);

4.CString和char*的轉化

方法一:使用wcstombs()函數

    char pChar[100];

    wcstombs(pChar,str,100);

方法二:使用wcstombs_s()函數

同上面一樣,wcstombs_s()是wcstombs()的安全版本:

總結:

      上面一會使用strcpy(),一會使用wcscpy(),一會又使用_tcscpy(),這三者有什麼關系呢,其實strcpy()處理的就是ASCII編碼的字元,像char,而wcscpy()處理的是Unicode 編碼,_tcscpy()則是一個宏,如果你使用的是ASCII編碼,那麼_tcscpy()表示的就是strcpy(),如果你使用的是Unicode編碼,那麼_tcscpy()表示的就是wcscpy(),這可以通過定義_UNICODE或UNICODE宏來實作。你可能已經知道了為什麼要定義這麼一個宏,對!就是為了代碼的移植。還有一個函數就是wcstombs(),這個函數是幹什麼用的呢?其實除了Unicode編碼,還有一個編碼,那就是多位元組編碼,通常用的是雙位元組編碼,vc就支援這種編碼,函數wcstombs()就是為了實作多位元組和單位元組轉換而設計的。