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);
因為本來轉化後的字串變得可以修改了,造成了安全隱患。
正確的轉化方法為:
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(),這可以通過定義_UNICODE或UNICODE巨集來實現。你可能已經知道了為什麼要定義這麼一個巨集,對!就是為了程式碼的移植。還有一個函式就是wcstombs(),這個函式是幹什麼用的呢?其實除了Unicode編碼,還有一個編碼,那就是多位元組編碼,通常用的是雙位元組編碼,vc就支援這種編碼,函式wcstombs()就是為了實現多位元組和單位元組轉換而設計的。
相關文章
- c++各種字串互轉(char*、wchar_t*、CString、string、wstring、LPCWSTR)C++字串
- C++中char*與wchar_t*之間的轉換C++
- CString,int,string,char*之間的轉換
- CString解析[轉]
- C++中string、char *、char[]、const char*的轉換C++
- CString與LPCWSTR、LPSTR、char*、LPWSTR等型別的轉換型別
- VS中”LPTSTR" 型別的值不能用於初始化 "char *" 型別的實體型別
- string與char陣列相互轉換陣列
- c++中字串之string和charC++字串
- C++中char* const char* string 之間的轉換複習C++
- Rust中 String、str、&str、char 的區別Rust
- 刨根問底:C++中寬字元型別(wchar_t)的編碼一定是Unicode?長度一定是16位?C++字元型別Unicode
- C 風格字串,C++string類,MFC,CString類的區別。字串C++
- delphi:string,PChar,Array of Char 之間的轉換
- C#中的char和string的使用簡介C#
- C++ unsigned char*轉化為string的形式C++
- char[] 轉換string時的自動截斷問題
- c#_驗證string每個char是否為數字C#
- 關於java的byte 和char 以及String等問題Java
- Java原始碼閱讀-String中的private final char value[];Java原始碼
- CString之GetBuffer與ReleaseBuffer
- C++中string轉換為char*型別返回後亂碼問題C++型別
- Java雜記17—String全面解析Java
- const char*, char const*, char*const的區別
- const char*, char const*, char*const 有何區別?
- JavaJNI使用之將JAVA的String[]字串陣列轉化成C語言的char**Java字串陣列C語言
- String不同定義的情況解析
- 解析java語言中String方法之indexOfJavaIndex
- HDU 4668 Finding string (解析字串 + KMP)字串KMP
- char str[]和char *str的區別
- ES6 -- String 擴充套件方法解析套件
- JDK原始碼解析系列之String 之一JDK原始碼
- java基礎(五) String性質深入解析Java
- char *的使用
- J2SE入門(三) String深度解析
- 深入解析 C# 的 String.Create 的方法C#
- 全面解析Java中的String資料型別Java資料型別
- C# string byte陣列轉換解析C#陣列