原文出處:不祥
參考url: http://www.cnblogs.com/mugua/archive/2009/03/29/1424629.html
一、VC中字符串類型的互相轉換
總是覺得VC中的類型紛繁複雜,撲朔迷離。因爲有了Unicode,因爲C、C++類型相互轉化如此不同。保存char的不止char一種,還可以用short,unsigned short,int 等來保存。單單就字符串就有N多種類型,其它類型也不止一個。再加上C++中本來就沒有正式的string類型,所以,平常就會碰到很多種相同意思,但不同類型,或相同類型,不同寫法的Type.
如何在他們之間相互轉化,也是在學習VC中避免不了的一個問題。
現來看平時常用的保存字符串的類型有那些?
Cstring、TCHAR*、 TCHAR[]、 char*、 LPCSTR、 LPCTSTR、 LPBYTE
以上都是在VC中用的比較多得。他們之間如何轉化:
這裏,把Cstring看作一個轉換的中間值,任何類型都是相它看齊。
1. LPCSTR ←→Cstring
LPCSTR在VC中代表的是char*」但並不能用char*的方式去轉換它。它與Cstring可以直接互換,就像以下代碼這樣:
Cstring strHello;
strHello="Hello world";
LPCSTR lpStr=(LPCSTR)strHello;
Cstring str2;
str2=(CString)lpStr;
另外,Cstring類有一成員函數Format,可以用來把類型轉換成Cstring類型,以上lpStr轉換成Cstring可以這樣表示:
str2.Format("%s",lpStr);
2. LPCTSTR←→Cstring
LPCTSTR和LPCSTR轉換方式是一樣的,所不同的是兩個類型本身不一樣。LPCTSTR表示的是unsigned short*,這樣,它可以支持Unicode字符類型,而LPCSTR只支持ANSI字符類型。平常,我們一般可以用LPCTSTR來代替LPCSTR。
3. TCHAR*(char*)←→Cstring
TCHAR在VC中表示的是unsigned short,可以支持Unicode字符集。兩類型之間的轉換可以像以下這樣
TCHAR* myChars = strHello.GetBuffer(strHello.GetLength());
str2=(CString)myChars; //或者str2.Format("%s",myChars);
注意:Cstring轉TCHAR*不能用以下代碼轉換:
myChars = (LPCTSTR)strHello; //Error,Can not Convert from 'const char*' to 'char*'
也不能這樣轉化:
myChars=(LPTSTR)strHello; //Cstring不能轉化爲char*
但是可以這樣:
myChars=(LPTSTR)(LPCTSTR)strHello; //先把strHello轉化爲const char*,再轉化爲char*
4. LPBYTE←→Cstring
LPBYTE是unsigned char*類型,它們之間的轉換如下:
LPBYTE lpByte = (LPBYTE)strHello.GetBuffer(strHello.GetLength());
//GetBuffer返回的是LPTSTR類型
//也可以這樣轉換:
5. TCHAR[]←→Cstring
它們之間的轉換又不一樣,因爲涉及到數組。所以用strcpy函數來進行,strCpy的函數原型如下:
LPTSTR StrCpy(LPTSTR psz1,LPCTSTR )
它們之間的轉換如下:
CHAR strChar[200]
StrCpy(strChar,(LPCTSTR)strHello);
Cstring str2 = (CString)strChar; //或者用Format函數
由此可見,Cstring轉換到別的類型,都要轉成LPCSTR或者LPCTSTR類型這一關(LPCSTR,LPCTSTR代表了const char* , const short*)。然後再通過LPCSTR或LPCTSTR轉換成別的類型(包括unsigned char*,char*),所以,要把Cstring轉換成其它類型,首先看這個類型是不是const char* 或者const short*,如果是,可以直接轉,如果不是,首先轉成LPCSTR或LPCTSTR,再把它們強制轉換成相應的字符串類型.
而任何類型轉換成Cstring,則需要在前面加上(CString)強制轉換即可,或者用Cstring類的成員函數Format
二、VC中其它常用類型轉換
其中,很多函數都用到<stdlib.h>和<wchar.h>,如果用到,要把頭文件包含進源文件.
1.字符串轉換成其它類型
Double atof(char* string); Double wtof(const wchar_t* string); int atoi(const char* string); _int64 _atoi64(const char* string) int wtoi(const wchar_t* string); int64 wtoi64(const wchar_t* string); long atol(const char* string); long wtol(const wchar_t* string);
舉例:
char* s="-2309.12E-15"; double x=atof(s); //out:-2309120E-012 s="-9885 pigs"; int I=atoi(s); //out:-9885
2.其它類型轉換成字符型:
char* itoa(int value,char* string,int radix); char* i64toa(int64 value,char* string,int radix); char* ui64toa(unsigned int64 value,char* string,int radix); wchar_t * itow(int value, wchar_t string, int radix); char* _ltoa(long value,char* string,int radix);
舉例:
int i=100; itoa(i,temp,10); //十進制 itoa(i,temp,2); //二進制 Cstring str; Str.Fomat("%d",i); //整型to Cstring Str.Format("%f",f); //Float to CString