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()就是為了實作多位元組和單位元組轉換而設計的。