




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、VC+常用數(shù)據(jù)類型及其操作詳解一.VC常用數(shù)據(jù)類型列表二.常用數(shù)據(jù)類型轉(zhuǎn)化2.1數(shù)學類型變量與字符串相互轉(zhuǎn)換2.2 CString及string,char *與其他數(shù)據(jù)類型的轉(zhuǎn)換和操作CString,string,char*的綜合比較數(shù)學類型與CString相互轉(zhuǎn)化CString與char*相互轉(zhuǎn)換舉例CString 與 BSTR 型轉(zhuǎn)換VARIANT 型轉(zhuǎn)化成 CString 型2.3 BSTR、_bstr_t與CComBSTR2.4 VARIANT 、_variant_t 與 COleVariant附錄CString及字符串轉(zhuǎn)及操作詳解 參考書籍:CSDN,<<MFC
2、深入淺出(Second Edit)>> 一VC常用數(shù)據(jù)類型列表 TypeDefault SizeDescription 基礎(chǔ)類型 全是小寫 說明:這些基
3、礎(chǔ)數(shù)據(jù)類型對于MFC還是API都是被支持的booleanunsigned 8 bit ,取值TRUE/FALSEbyteunsigned 8 bit,整數(shù),輸出按字符輸出charunsigned 8 bit,字符doublesigned 64 bit浮點型floatsigned32 bit浮點型handle_t Primitive handle typehypersigned 64 bit整型intsigned 32 bit整型longsigned 32 bit整型shortsigned 16 bit整型smallsigned 8 bit整型void *32-bit指向未知類型的指針
4、wchar_tunsigned 16 bit16位字符,比char可容納更多的字符 Win32API常用數(shù)據(jù)類型 全大寫說明: 這些Win32API支持的簡單數(shù)據(jù)類型主要是用來定義函數(shù)返回值,消息參數(shù),結(jié)構(gòu)成員。這類數(shù)據(jù)類型大致可以分為五大類:字符型、布爾型、整型、指針型和句柄型(?). 總共大概有100多種不同的類型BOOL/BOOLEAN8bit,TRUE/FALSE布爾型BYTEunsigned 8 bit BSTRCComBSTR_bstr_t32 bitBSTR是指向字符串的32位指針是對BSTR的封裝是對BSTR的封裝CHAR8
5、 bit(ANSI)字符類型COLORREF32 bitRGB顏色值 整型DWORDunsigned 32 bit整型FLOATfloat型float型HANDLE Object句柄HBITMAP bitmap句柄HBRUSH brush句柄HCURSOR cursor句柄HDC 設(shè)備上下文句柄HFILE OpenFile打開的File句柄HFONT font句柄HHOOK hook句柄HKEY 注冊表鍵句柄HPEN pen句柄HWND window句柄INT-LONG-LONGLON
6、G 64位帶符號整型LPARAM32 bit消息參數(shù)LPBOOL BOOL型指針LPBYTE BYTE型指針LPCOLOREF COLORREF型指針LPCSTR/LPSTR/PCSTR 指向8位(ANSI)字符串類型指針LPCWSTR/LPWSTR/PCWSTR 指向16位Unicode字符串類型LPCTSTR/LPTSTR/PCTSTR 指向一8位或16位字符串類型指針LPVOID 指向一個未指定類型的32位指針LPDWORD 指向一個DWORD型指針其他相似類型: LPHANDLE、LPINT、LP
7、LONG、LPWORD、LPRESULTPBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT說明:(1)在16位系統(tǒng)中 LP為16bit,P為8bit,在32位系統(tǒng)中都是32bit(此時等價)(2)LPCSTR等 中的C指Const,T表示TCHAR模式即可以工作在ANSI下也可UNICODESHORTusigned整型其他UCHAR、UINT、ULONG、ULONGLONG、USHORT為無符號相應(yīng)類型TBYTE WCHAR型或者CHAR型TCHAR ANSI與unicode均可VARIANT
8、_variant_tCOleVariant 一個結(jié)構(gòu)體參考OAIDL.H_variant_t是VARIANT的封裝類COleVariant也是VARIANT的封裝類 WNDPROC 指向一個窗口過程的32位指針WCHAR 16位Unicode字符型WORD 16位無符號整型WPARAM 消息參數(shù)MFC獨有數(shù)據(jù)類型下面兩個數(shù)據(jù)類型是微軟基礎(chǔ)類庫中獨有的數(shù)據(jù)類型POSITION標記集合中一個元素的位置的值,被MFC中的集合類所使用LPCRECT指向一個RECT結(jié)構(gòu)體常量(不能修改
9、)的32位指針CString其實是MFC中的一個類 說明:(1)-表示省略(2)1Byte=8Bit,字與機器有關(guān),在8位系統(tǒng)中:字=1字節(jié),16位系統(tǒng)中,1字=2字節(jié),32位中:1字=4字節(jié),64位中1字=8字節(jié).不要搞混這些概念. 二常用數(shù)據(jù)類型轉(zhuǎn)化及操作 21 數(shù)學類型變量與字符串相互轉(zhuǎn)換(這些函數(shù)都在STDLIB.H里)(1)將數(shù)學類型轉(zhuǎn)換為字符串可以用以下一些函數(shù):舉例: _CRTIMP char * _cdecl _itoa(int, char *, int);/這是一個將數(shù)字轉(zhuǎn)換為一個字符串類型的函數(shù),最后一個in
10、t表示轉(zhuǎn)換的進制如以下程序:int iTyep=3;char *szChar;itoa(iType,szChar,2);cout<<szChar;/輸出為1010類似函數(shù)列表:_CRTIMP char * _cdecl _itoa(int, char *, int);/為了完整性,也列在其中_CRTIMP char * _cdecl _ultoa(unsigned long, char *, int);_CRTIMP char * _cdecl _ltoa(long, char *, int);_CRTIMP char * _cdecl _i64toa(_int64, char *
11、, int);_CRTIMP char * _cdecl _ui64toa(unsigned _int64, char *, int);_CRTIMP wchar_t * _cdecl _i64tow(_int64, wchar_t *, int);_CRTIMP wchar_t * _cdecl _ui64tow(unsigned _int64, wchar_t *, int);_CRTIMP wchar_t * _cdecl _itow (int, wchar_t *, int);/轉(zhuǎn)換為長字符串類型_CRTIMP wchar_t * _cdecl _ltow (long, wchar_t
12、 *, int);_CRTIMP wchar_t * _cdecl _ultow (unsigned long, wchar_t *, int);還有很多,請自行研究 (2)將字符串類型轉(zhuǎn)換為數(shù)學類型變量可以用以下一些函數(shù):舉例: _CRTIMP int _cdecl atoi(const char *);/參數(shù)一看就很明了char *szChar=”88”;int temp(0);temp=atoi(szChar);cout<<temp;類似的函數(shù)列表:_CRTIMP int _cdecl atoi(const char
13、*);_CRTIMP double _cdecl atof(const char *);_CRTIMP long _cdecl atol(const char *);_CRTIMP long double _cdecl _atold(const char *);_CRTIMP _int64 _cdecl _atoi64(const char *);_CRTIMP double _cdecl strtod(const char *, char *);/_CRTIMP long _cdecl strtol(const char *, char *,
14、int);/_CRTIMP long double _cdecl _strtold(const char *, char *);_CRTIMP unsigned long _cdecl strtoul(const char *, char *, int);_CRTIMP double _cdecl wcstod(const wchar_t *, wchar_t *);/長字符串類型轉(zhuǎn)換為數(shù)學類型_CRTIMP long _cdecl wcstol(const wchar_t *, wchar_t *, int);_CRTIMP unsigned long _cdecl
15、wcstoul(const wchar_t *, wchar_t *, int);_CRTIMP int _cdecl _wtoi(const wchar_t *);_CRTIMP long _cdecl _wtol(const wchar_t *);_CRTIMP _int64 _cdecl _wtoi64(const wchar_t *);還有很多,請自行研究 22CString及string,char *與其他數(shù)據(jù)類型的轉(zhuǎn)換和操作(1)CString,string,char*的綜合比較(這部分CSDN上的作者joise的文章<< CStrin
16、g,string,char*的綜合比較>>寫的很詳細,請大家在仔細閱讀他的文章.地址: 或參考附錄: (2)轉(zhuǎn)換:數(shù)學類型與CString相互轉(zhuǎn)化 數(shù)學類型轉(zhuǎn)化為CString可用Format函數(shù),舉例:CString s;int i = 64;s.Format("%d", i)CString轉(zhuǎn)換為數(shù)學類型:舉例CString strValue("1.234");double dblValue;dblValue = atof(LPCTSTR)strValue);CString與char*相互轉(zhuǎn)換舉例C
17、String strValue(“Hello”);char *szValue;szValue=strValue.GetBuffer(szValue);也可用(LPSTR)(LPCTSTR)對CString / 進行強制轉(zhuǎn)換. szValue=(LPSTR)(LPCTSTR)strValue;反過來可直接賦值:char *szChar=NULL;CString strValue;szChar=new char10;memset(szChar,0,10);strcpy(szChar,”Hello”);strValue=szChar;CString 與 B
18、STR 型轉(zhuǎn)換CString 型轉(zhuǎn)化成 BSTR 型當我們使用 ActiveX 控件編程時,經(jīng)常需要用到將某個值表示成 BSTR 類型.BSTR 是一種記數(shù)字符串,Intel平臺上的寬字符串(Unicode),并且可以包含嵌入的 NULL 字符??梢哉{(diào)用 CString 對象的 AllocSysString 方法將 CString 轉(zhuǎn)化成 BSTR:CString str;str = .; / whateverBSTR bStr = str.AllocSysString(); BSTR型轉(zhuǎn)換為CString如果你在 UNICODE 模式下編譯代碼,你可以簡單地寫成:CString c
19、onvert(BSTR bStr) if(bStr = NULL) return CString(_T(""); CString s(bStr); / in UNICODE mode return s;如果是 ANSI 模式CString convert(BSTR b) CString s; if(b = NULL
20、) return s; / empty for NULL BSTR#ifdef UNICODE s = b;#else LPSTR p = s.GetBuffer(SysStringLen(b) + 1); :WideCharToMultiByte(CP_ACP, / ANSI Code
21、 Page 0, / no flags
22、; b, / source widechar string &
23、#160; -1, / assume NUL-terminated
24、60; p, / target buffer
25、160; SysStringLen(b)+1, / target buffer length NULL, /
26、 use system default char NULL); / don''t care if default used
27、60; s.ReleaseBuffer();#endif return s; VARIANT 型轉(zhuǎn)化成 CString 型VARIANT 類型經(jīng)常用來給 COM 對象傳遞參數(shù),或者接收從 COM 對象返回的值。你也能自己編寫返回 VARIANT 類型的方法,函數(shù)返回什么類型 依賴可能(并且常常)方法的輸入?yún)?shù)(比如,在自動化操作中,依賴與你調(diào)用哪個方法。IDispatch:Invoke 可能返回(通過其一個參數(shù))一個 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 類型的結(jié)果,(詳見 MSD
28、N 上的 VARIANT 結(jié)構(gòu)的定義)。在下面的例子中,假設(shè) 類型是一個BSTR的變體,也就是說在串中的值是通過 bsrtVal 來引用,其優(yōu)點是在 ANSI 應(yīng)用中,有一個構(gòu)造函數(shù)會把 LPCWCHAR 引用的值轉(zhuǎn)換為一個 CString(見 BSTR-to-CString 部分)。在 Unicode 模式中,將成為標準的 CString 構(gòu)造函數(shù),參見對缺省:WideCharToMultiByte 轉(zhuǎn)換的告誡,以及你覺得是否可以接受(大多數(shù)情況下,你會滿意的)。VARIANT vaData;vaData = m_com.YourMethodHere();ASSERT(vaData.vt =
29、 VT_BSTR);CString strData(vaData.bstrVal);你還可以根據(jù) vt 域的不同來建立更通用的轉(zhuǎn)換例程。為此你可能會考慮:CString VariantToString(VARIANT * va) CString s; switch(va->vt) /* vt */ case VT_BSTR:
30、160; return CString(vaData->bstrVal); case VT_BSTR | VT_BYREF: return CString(*vaData->pbstrVal); case VT_I4:
31、; s.Format(_T("%d"), va->lVal); return s; case VT_I4 | VT_BYREF: s.Format(_T("%d"), *va->plVal);
32、0; case VT_R8: s.Format(_T("%f"), va->dblVal); return s; . 剩下的類型轉(zhuǎn)換由讀者自己完成 default: &
33、#160; ASSERT(FALSE); / unknown VARIANT type (this ASSERT is optional) return CString(""); /* vt */ 23 BSTR、_bstr_t與CComBSTRCComBSTR、_bstr_t是對BSTR的封裝,BSTR是指向字符串的32位指針
34、。char *轉(zhuǎn)換到BSTR可以這樣:BSTR b=_com_util:ConvertStringToBSTR("數(shù)據(jù)");/使用前需要加上頭文件comutil.h反之可以使用char *p=_com_util:ConvertBSTRToString(b); 24(引)VARIANT 、_variant_t 與 COleVariantVARIANT的結(jié)構(gòu)可以參考頭文件VC98/Include/OAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。對于VARIANT變量的賦值:首先給vt成員賦值,指明數(shù)據(jù)類型,再對聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值,舉個例子:VARI
35、ANT va;int a=2001;va.vt=VT_I4;/指明整型數(shù)據(jù)va.lVal=a; /賦值對于不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);進行初始化,其本質(zhì)是將vt設(shè)置為VT_EMPTY,下表我們列舉vt與常用數(shù)據(jù)的對應(yīng)關(guān)系:unsigned char bVal; VT_UI1short iVal; VT_I2long lVal; VT_I4float fltVal; VT_R4double dblVal; VT_R8VARIANT_BOOL boolVal; VT_BOOLSCODE scode; VT_ER
36、RORCY cyVal; VT_CYDATE date; VT_DATEBSTR bstrVal; VT_BSTRIUnknown FAR* punkVal; VT_UNKNOWNIDispatch FAR* pdispVal; VT_DISPATCHSAFEARRAY FAR* parray; VT_ARRAY|*unsigned char FAR* pbVal; VT_BYREF|VT_UI1short FAR* piVal; VT_BYREF|VT_I2long FAR* plVal; VT_BYREF|VT_I4float FAR* pfltVal; VT_BYREF|VT_R4dou
37、ble FAR* pdblVal; VT_BYREF|VT_R8VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOLSCODE FAR* pscode; VT_BYREF|VT_ERRORCY FAR* pcyVal; VT_BYREF|VT_CYDATE FAR* pdate; VT_BYREF|VT_DATEBSTR FAR* pbstrVal; VT_BYREF|VT_BSTRIUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWNIDispatch FAR* FAR* ppdispVal; VT_BYREF|V
38、T_DISPATCHSAFEARRAY FAR* FAR* pparray; VT_ARRAY|*VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANTvoid FAR* byref; VT_BYREF_variant_t是VARIANT的封裝類,其賦值可以使用強制類型轉(zhuǎn)換,其構(gòu)造函數(shù)會自動處理這些數(shù)據(jù)類型。例如:long l=222;ing i=100;_variant_t lVal(l);lVal = (long)i;COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子:COleVariant v3 = "字符串"
39、, v4 = (long)1999;CString str =(BSTR)v3.pbstrVal;long i = v4.lVal;一、BSTR、LPSTR和LPWSTR 在Visual C+.NET的所有編程方式中,我們常常要用到這樣的一些基本字符串類型,如BSTR、LPSTR和LPWSTR等。之所以出現(xiàn)類似上述的這些數(shù)據(jù)類型,是因為不同編程語言之間的數(shù)據(jù)交換以及對ANSI、Unicode和多字節(jié)字符集(MBCS)的支持。 那么什么是BSTR、LPSTR以及LPWSTR呢? BSTR(Basic STRing,Basic字符串)是一個OLECHAR*類型的Uni
40、code字符串。它被描述成一個與自動化相兼容的類型。由于操作系統(tǒng)提供相應(yīng)的 API函數(shù)(如SysAllocString)來管理它以及一些默認的調(diào)度代碼,因此BSTR實際上就是一個COM字符串,但它卻在自動化技術(shù)以外的多種場合下得到廣泛使用。圖1描述了BSTR的結(jié)構(gòu),其中DWORD值是字符串中實際所占用的字節(jié)數(shù),且它的值是字符串中Unicode字符的兩倍。 LPSTR和LPWSTR是Win32和VC+所使用的一種字符串數(shù)據(jù)類型。LPSTR被定義成是一個指向以NULL(/0)結(jié)尾的8位ANSI 字符數(shù)組指針,而LPWSTR是一個指向以NULL結(jié)尾的16位雙字節(jié)字符數(shù)組指針。在VC+中,還
41、有類似的字符串類型,如LPTSTR、 LPCTSTR等,它們的含義如圖2所示。 例如,LPCTSTR是指“l(fā)ong pointer to a constant generic string”,表示“一個指向一般字符串常量的長指針類型”,與C/C+的const char*相映射,而LPTSTR映射為 char*。 一般地,還有下列類型定義: #ifdef UNICODE typedef LPWSTR LPTSTR; typedef LPCWSTR LPCTSTR; #else typedef LPSTR LPTSTR;
42、0;typedef LPCSTR LPCTSTR; #endif 二、CString、CStringA 和 CStringW Visual C+.NET中將CStringT作為ATL和MFC的共享的“一般”字符串類,它有CString、CStringA和CStringW三種形式,分別操作不同字符類型的字符串。這些字符類型是TCHAR、char和wchar_t。TCHAR在Unicode平臺中等同于WCHAR(16位 Unicode字符),在ANSI中等價于char。wchar_t通常定義為unsigned short。由于CString在MFC應(yīng)用程序中經(jīng)常用到,
43、這里不再重復。 三、VARIANT、COleVariant 和_variant_t 在OLE、ActiveX和COM中,VARIANT數(shù)據(jù)類型提供了一種非常有效的機制,由于它既包含了數(shù)據(jù)本身,也包含了數(shù)據(jù)的類型,因而它可以實現(xiàn)各種不同的自動化數(shù)據(jù)的傳輸。下面讓我們來看看OAIDL.H文件中VARIANT定義的一個簡化版: struct tagVARIANT VARTYPE vt; union short iVal; / VT_I2. long lVal;
44、0;/ VT_I4. float fltVal; / VT_R4. double dblVal; / VT_R8. DATE date; / VT_DATE. BSTR bstrVal; / VT_BSTR. short * piVal; / VT_BYREF|VT_I2. long * plVal; / VT_BYREF|VT_I4. float * pfltVal; / VT_BYREF|VT_R4. d
45、ouble * pdblVal; / VT_BYREF|VT_R8. DATE * pdate; / VT_BYREF|VT_DATE. BSTR * pbstrVal; / VT_BYREF|VT_BSTR. 顯然,VARIANT類型是一個C結(jié)構(gòu),它包含了一個類型成員vt、一些保留字節(jié)以及一個大的union類型。例如,如果vt為VT_I2,那么我們可以從iVal中讀出VARIANT的值。同樣,當給一個VARIANT變量賦值時,也要先指明其類型。例如: VARIANT va;
46、0;: VariantInit(&va); / 初始化 int a = 2002; va.vt = VT_I4; / 指明long數(shù)據(jù)類型 va.lVal = a; / 賦值 為了方便處理VARIANT類型的變量,Windows還提供了這樣一些非常有用的函數(shù): VariantInit 將變量初始化為VT_EMPTY; VariantClear 消除并初始化VARIANT; VariantChangeType 改變VARIANT的類型; VariantCopy 釋放與目標VARIANT相連的內(nèi)存并復制源VAR
47、IANT。 COleVariant類是對VARIANT結(jié)構(gòu)的封裝。它的構(gòu)造函數(shù)具有極為強大大的功能,當對象構(gòu)造時首先調(diào)用VariantInit進行初始化,然后根據(jù)參數(shù)中的標準類型調(diào)用相應(yīng)的構(gòu)造函數(shù),并使用VariantCopy進行轉(zhuǎn)換賦值操作,當VARIANT對象不在有效范圍時,它的析構(gòu)函數(shù)就會被自動調(diào)用,由于析構(gòu)函數(shù)調(diào)用了VariantClear,因而相應(yīng)的內(nèi)存就會被自動清除。除此之外,COleVariant的賦值操作符在與VARIANT類型轉(zhuǎn)換中為我們提供極大的方便。例如下面的代碼: COleVariant v1("This is a test");
48、 / 直接構(gòu)造 COleVariant v2 = "This is a test" / 結(jié)果是VT_BSTR類型,值為"This is a test" COleVariant v3(long)2002); COleVariant v4 = (long)2002; / 結(jié)果是VT_I4類型,值為2002 _variant_t是一個用于COM的VARIANT類,它的功能與COleVariant相似。不過在Visual C+.NET的MFC應(yīng)用程序中使用時需要在代碼文件前面添加下列兩句: #
49、include "comutil.h" #pragma comment( lib, "comsupp.lib" ) 四、CComBSTR和_bstr_t CComBSTR是對BSTR數(shù)據(jù)類型封裝的一個ATL類,它的操作比較方便。例如: CComBSTR bstr1; bstr1 = "Bye" / 直接賦值 OLECHAR* str = OLESTR("ta ta"); / 長度為5的寬字符 CComBSTR
50、bstr2(wcslen(str); / 定義長度為5 wcscpy(bstr2.m_str, str); / 將寬字符串復制到BSTR中 CComBSTR bstr3(5, OLESTR("Hello World"); CComBSTR bstr4(5, "Hello World"); CComBSTR bstr5(OLESTR("Hey there"); CComBSTR bstr6("Hey there"); CComBSTR bstr7(bstr6
51、); / 構(gòu)造時復制,內(nèi)容為"Hey there" _bstr_t是是C+對BSTR的封裝,它的構(gòu)造和析構(gòu)函數(shù)分別調(diào)用SysAllocString和SysFreeString函數(shù),其他操作是借用BSTR API函數(shù)。與_variant_t相似,使用時也要添加comutil.h和comsupp.lib。 五、BSTR、char*和CString轉(zhuǎn)換 (1) char*轉(zhuǎn)換成CString 若將char*轉(zhuǎn)換成CString,除了直接賦值外,還可使用CString:Format進行。例如: char chArray =
52、 "This is a test" char * p = "This is a test" 或 LPSTR p = "This is a test" 或在已定義Unicode應(yīng)的用程序中 TCHAR * p = _T("This is a test"); 或 LPTSTR p = _T("This is a test"); CString theString = chArray; theString.For
53、mat(_T("%s"), chArray); theString = p; (2) CString轉(zhuǎn)換成char* 若將CString類轉(zhuǎn)換成char*(LPSTR)類型,常常使用下列三種方法: 方法一,使用強制轉(zhuǎn)換。例如: CString theString( "This is a test" ); LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; 方法二,使用strcpy。例如: CString theString( "This
54、 is a test" ); LPTSTR lpsz = new TCHARtheString.GetLength()+1; _tcscpy(lpsz, theString); 需要說明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二個參數(shù)是 const wchar_t* (Unicode)或const char* (ANSI),系統(tǒng)編譯器將會自動對其進行轉(zhuǎn)換。 方法三,使用CString:GetBuffer。例如: CString s(_T("This is a test ");
55、60;LPTSTR p = s.GetBuffer(); / 在這里添加使用p的代碼 if(p != NULL) *p = _T('/0'); s.ReleaseBuffer(); / 使用完后及時釋放,以便能使用其它的CString成員函數(shù) (3) BSTR轉(zhuǎn)換成char* 方法一,使用ConvertBSTRToString。例如: #include #pragma comment(lib, "comsupp.lib") int _tmain(int argc, _T
56、CHAR* argv) BSTR bstrText = :SysAllocString(L"Test"); char* lpszText2 = _com_util:ConvertBSTRToString(bstrText); SysFreeString(bstrText); / 用完釋放 delete lpszText2; return 0; 方法二,使用_bstr_t的賦值運算符重載。例如: _bstr_t b = bstrText; char* lpszText2 = b;
57、60;(4) char*轉(zhuǎn)換成BSTR 方法一,使用SysAllocString等API函數(shù)。例如: BSTR bstrText = :SysAllocString(L"Test"); BSTR bstrText = :SysAllocStringLen(L"Test",4); BSTR bstrText = :SysAllocStringByteLen("Test",4); 方法二,使用COleVariant或_variant_t。例如: /COleVariant strV
58、ar("This is a test"); _variant_t strVar("This is a test"); BSTR bstrText = strVar.bstrVal; 方法三,使用_bstr_t,這是一種最簡單的方法。例如: BSTR bstrText = _bstr_t("This is a test"); 方法四,使用CComBSTR。例如: BSTR bstrText = CComBSTR("This is a test");
59、;或 CComBSTR bstr("This is a test"); BSTR bstrText = bstr.m_str; 方法五,使用ConvertStringToBSTR。例如: char* lpszText = "Test" BSTR bstrText = _com_util:ConvertStringToBSTR(lpszText); (5) CString轉(zhuǎn)換成BSTR 通常是通過使用CStringT:AllocSysString來實現(xiàn)。例如: CString
60、str("This is a test"); BSTR bstrText = str.AllocSysString(); SysFreeString(bstrText); / 用完釋放 (6) BSTR轉(zhuǎn)換成CString 一般可按下列方法進行: BSTR bstrText = :SysAllocString(L"Test"); CStringA str; str.Empty(); str = bstrText; 或 CStringA str(
61、bstrText); (7) ANSI、Unicode和寬字符之間的轉(zhuǎn)換 方法一,使用MultiByteToWideChar將ANSI字符轉(zhuǎn)換成Unicode字符,使用WideCharToMultiByte將Unicode字符轉(zhuǎn)換成ANSI字符。 方法二,使用“_T”將ANSI轉(zhuǎn)換成“一般”類型字符串,使用“L”將ANSI轉(zhuǎn)換成Unicode,而在托管C+環(huán)境中還可使用S將ANSI字符串轉(zhuǎn)換成String*對象。例如: TCHAR tstr = _T("this is a test"); wchar_t wszStr = L
62、"This is a test" String* str = S”This is a test”; 方法三,使用ATL 7.0的轉(zhuǎn)換宏和類。ATL7.0在原有3.0基礎(chǔ)上完善和增加了許多字符串轉(zhuǎn)換宏以及提供相應(yīng)的類,它具有如圖3所示的統(tǒng)一形式: 其中,第一個C表示“類”,以便于ATL 3.0宏相區(qū)別,第二個C表示常量,2表示“to”,EX表示要開辟一定大小的緩沖。SourceType和DestinationType可以是A、 T、W和OLE,其含義分別是ANSI、Unicode、“一般”類型和OLE字符串。例如,CA2CT就是將ANSI轉(zhuǎn)換成一
63、般類型的字符串常量。下面是一些示例代碼: LPTSTR tstr= CA2TEX<16>("this is a test"); LPCTSTR tcstr= CA2CT("this is a test"); wchar_t wszStr = L"This is a test" char* chstr = CW2A(wszStr); 六、結(jié)語幾乎所有的程序都要用到字符串,而Visual C+.NET由于功能強大、應(yīng)用廣泛,因而字符串之間的轉(zhuǎn)換更為頻繁。本文幾乎涉及到目前的所有
64、轉(zhuǎn)換方法。當然對于.NET框架來說,還可使用Convert和Text類進行不同數(shù)據(jù)類型以及字符編碼之間的相互轉(zhuǎn)換。int i = 100;long l = 2001;float f=300.2;double d=12345.119;char username="程佩君"char temp200;char *buf;CString str;_variant_t v1;_bstr_t v2;一、其它數(shù)據(jù)類型轉(zhuǎn)換為字符串 · 短整型(int) itoa(i,temp,10);/將i轉(zhuǎn)換為字符串放入temp中,最后一個數(shù)字表示十進制 itoa
65、(i,temp,2); /按二進制方式轉(zhuǎn)換· 長整型(long)ltoa(l,temp,10);· 浮點數(shù)(float,double)用fcvt可以完成轉(zhuǎn)換,這是MSDN中的例子:int decimal, sign; char *buffer; double source = 3.1415926535; buffer = _fcvt( source, 7, &decimal, &sign ); 運行結(jié)果:source: 3.1415926535 buffer: '31415927' decimal: 1
66、 sign: 0decimal表示小數(shù)點的位置,sign表示符號:0為正數(shù),1為負數(shù)· CString變量str = "2008北京奧運"buf = (LPSTR)(LPCTSTR)str;· BSTR變量BSTR bstrValue = :SysAllocString(L"程序員"); char * buf = _com_util:ConvertBSTRToString(bstrValue); SysFreeString(bstrValue); AfxMessageBox(buf); dele
67、te(buf);· CComBSTR變量CComBSTR bstrVar("test"); char *buf = _com_util:ConvertBSTRToString(bstrVar.m_str); AfxMessageBox(buf); delete(buf);· _bstr_t變量_bstr_t類型是對BSTR的封裝,因為已經(jīng)重載了=操作符,所以很容易使用_bstr_t bstrVar("test"); const char *buf = bstrVar;/不要修改buf中的內(nèi)容
68、160;AfxMessageBox(buf);· 通用方法(針對非COM數(shù)據(jù)類型)用sprintf完成轉(zhuǎn)換char buffer200;char c = '1'int i = 35;long j = 1000;float f = 1.7320534f;sprintf( buffer, "%c",c);sprintf( buffer, "%d",i);sprintf( buffer, "%d",j);sprintf( buffer, "%f",f);二、字符串轉(zhuǎn)換為其它數(shù)據(jù)類型strcpy(temp,"123")
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)部承包建筑合同范本
- 汽車鋁材購買合同范本
- 外貿(mào)中購銷合同范本
- 2025年道路運輸服務(wù)項目建議書
- 2025年輻射劑量監(jiān)測儀項目發(fā)展計劃
- 電影合作拍攝合同書
- 二零二五年房產(chǎn)交易稅費減免簡易房屋買賣合同
- 二零二五年度醫(yī)療健康基金份額代持與產(chǎn)業(yè)升級協(xié)議
- 二零二五年度智能設(shè)備維護勞務(wù)合同解除途徑解析
- 專利使用許可協(xié)議模板(2025年度)-互聯(lián)網(wǎng)
- DB13(J)T 8359-2020 被動式超低能耗居住建筑節(jié)能設(shè)計標準(2021年版)
- 中學生文明禮儀主題班會PPT精美版課件
- JIS C9335-1-2014 家用和類似用途電器.安全性.第1部分:通用要求
- 甲溝炎治療的護理與預防
- 哈工大微電子工藝緒論01單晶硅
- 中國地理4-河流與湖泊-于
- 供養(yǎng)直系親屬有關(guān)文件
- 出口退稅手冊核銷操作步驟
- 穿孔鋁板技術(shù)交底
- 第三章社科信息檢索原理與技術(shù)PPT課件
- 危大工程管理細則(廣西區(qū)規(guī)定)
評論
0/150
提交評論