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

double2li發表於2012-11-23

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.116位作業系統遺留下來的,在win32中以及其他的32位作業系統中, long指標和near指標及far修飾符都

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

P表示這是一個指標

C表示是一個常量

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

STR表示這個變數是一個字串

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

    typedef TCHAR* LPTSTR

L、PT的含義同上。

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:stringc++中的字串變數,因為操作c型別的char非常麻煩,而且很容易出現記憶體洩漏,所以c++就對c中的char 進行了封裝,其中

    包含了賦值、刪除、增加等常用操作,這些操作都不用考慮記憶體,是的使用更加方便,所以能使用string就儘量使用string,使用string要包含其標頭檔案:

    #include <string>

    注意不是:

    #include <string.h>

因為string.hC字串標頭檔案。

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_tc++中用來表示寬位元組的資料型別,即unicode編碼的資料型別。

    7.char:charc中的字元資料型別,屬於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);

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

正確的轉化方法為:

    CString str(“string”);

    LPTSTR pStr = str.GetBuffer();

    str.ReleaseBuffer();

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

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

方法一:使用wcscpy()函式

    CString str(“string”);

    WCHAR pWchar[100];

    wcscpy(pWchar,str);

方法二:使用wcscpy_s()函式

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

    CString str(“string”);

    WCHAR pWchar[100];

    wcscpy(pWchar,100,str);

方法三:使用_tcscpy()函式

    CString str(“string”);

    WCHAR pStr[100];

    _tcscpy(pStr,str);

方法四:使用_tcscpy_s()函式

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

    CString str(“string”);

    WCHAR pStr[100];

    _tcscpy_s(pStr,100,str);

4.CString和char*的轉化

方法一:使用wcstombs()函式

    CString str(“string”);

    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(),這可以通過定義_UNICODEUNICODE巨集來實現。你可能已經知道了為什麼要定義這麼一個巨集,對!就是為了程式碼的移植。還有一個函式就是wcstombs(),這個函式是幹什麼用的呢?其實除了Unicode編碼,還有一個編碼,那就是多位元組編碼,通常用的是雙位元組編碼,vc就支援這種編碼,函式wcstombs()就是為了實現多位元組和單位元組轉換而設計的。


相關文章