常用C++數(shù)據(jù)類型轉(zhuǎn)換關(guān)系_第1頁
常用C++數(shù)據(jù)類型轉(zhuǎn)換關(guān)系_第2頁
常用C++數(shù)據(jù)類型轉(zhuǎn)換關(guān)系_第3頁
常用C++數(shù)據(jù)類型轉(zhuǎn)換關(guān)系_第4頁
常用C++數(shù)據(jù)類型轉(zhuǎn)換關(guān)系_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、CString是一個動態(tài)TCHAR數(shù)組,BSTR是一種專有格式的字符串(需要用系統(tǒng)提供的函數(shù)來操縱)LPCTSTR只是一個常量的TCHAR指針。CString 是一個完全獨立的類,動態(tài)的TCHAR數(shù)組,封裝了+等操作符和字符串操作方法。typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;vc+中各種字符串的表示法    首先char* 是指向ANSI字符數(shù)組的指針,其中每個字符占據(jù)8位(有效數(shù)據(jù)是除掉最高位的

2、其他7位),這里保持了與傳統(tǒng)的C,C+的兼容。   LP的含義是長指針(long pointer)。LPSTR是一個指向以0結(jié)尾的ANSI字符數(shù)組的指針,與char*可以互換使用,在win32中較多地使用LPSTR。而LPCSTR中增加的C的含義是“CONSTANT”(常量),表明這種數(shù)據(jù)類型的實例不能被使用它的API函數(shù)改變,除此之外,它與LPSTR是等同的。1.LP表示長指針,在win16下有長指針(LP)和短指針(P)的區(qū)別,而在win32下是沒有區(qū)別的,都是32位.所以這里的LP和P是等價的.2.C表示const3.T是TCHAR,在采用Unic

3、ode方式編譯時是wchar_t,在普通時編譯成char.   為了滿足程序代碼國際化的需要,業(yè)界推出了Unicode標準,它提供了一種簡單和一致的表達字符串的方法,所有字符中的字節(jié)都是16位的值,其數(shù)量也可以滿足差不多世界上所有書面語言字符的編碼需求,開發(fā)程序時使用Unicode(類型為wchar_t)是一種被鼓勵的做法。   LPWSTR與LPCWSTR由此產(chǎn)生,它們的含義類似于LPSTR與LPCSTR,只是字符數(shù)據(jù)是16位的wchar_t而不是char。  為了實現(xiàn)兩種編碼的通用,提出了TCHAR的定義:如果

4、定義_UNICODE,聲明如下:  typedef wchar_t TCHAR;如果沒有定義_UNICODE,則聲明如下:  typedef char TCHAR;LPTSTR和LPCTSTR中的含義就是每個字符是這樣的TCHAR。如 LPCTSTR:  #ifdef _UNICODE    typedef const wchar_t * LPCTSTR;  #else

5、0;   typedef const char * LPCTSTR;  #endifCString類中的字符就是被聲明為TCHAR類型的,它提供了一個封裝好的類供用戶方便地使用。VC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解先定義一些常見類型變量借以說明int i = 100;long l = 2001;float f=300.2;double d=12345.119;char username="女俠程佩君"ch

6、ar 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(i,temp,2);   /按二進制方式轉(zhuǎn)換 長整型(long)   ltoa(l,temp,10);二、從其它包含字符串的變

7、量中獲取指向該字符串的指針CString變量str = "2008北京奧運"buf = (LPSTR)(LPCTSTR)str; BSTR類型的_variant_t變量v1 = (_bstr_t)"程序員"buf = _com_util:ConvertBSTRToString(_bstr_t)v1);三、字符串轉(zhuǎn)換為其它數(shù)據(jù)類型strcpy(temp,"123"); 短整型(int)   i =&

8、#160;atoi(temp); 長整型(long)   l = atol(temp); 浮點(double)   d = atof(temp);四、其它數(shù)據(jù)類型轉(zhuǎn)換到CString   使用CString的成員函數(shù)Format來轉(zhuǎn)換,如:整數(shù)(int)   str.Format("%d",i); 浮點數(shù)(float)   str.Format("

9、%f",i); 字符串指針(char *)等已經(jīng)被CString構(gòu)造函數(shù)支持的數(shù)據(jù)類型可以直接賦值   str = username;五、BSTR、_bstr_t與CComBSTRCComBSTR、_bstr_t是對BSTR的封裝,BSTR是指向字符串的32位指針。char *轉(zhuǎn)換到BSTR可以這樣: BSTR b=_com_util:ConvertStringToBSTR("數(shù)據(jù)");  /使用前需要加上頭文件comutil.h反之可以使用ch

10、ar *p=_com_util:ConvertBSTRToString(b);六、VARIANT 、_variant_t 與 COleVariant   VARIANT的結(jié)構(gòu)可以參考頭文件VC98IncludeOAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。對于VARIANT變量的賦值:首先給vt成員賦值,指明數(shù)據(jù)類型,再對聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值,舉個例子:VARIANT va;int a=2001;va.vt=VT_I4;  /指明整型數(shù)據(jù)va.lVal=a;

11、0;  /賦值  對于不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);進行初始化,其本質(zhì)是將vt設置為VT_EMPTY,下表我們列舉vt與常用數(shù)據(jù)的對應關(guān)系:unsigned char bVal;   VT_UI1 short iVal;           VT_I2 

12、long lVal;            VT_I4 float fltVal;         VT_R4 double dblVal;        VT_R8 VARIANT_BOOL boolVal; VT_BOOL&#

13、160;SCODE scode;          VT_ERROR CY cyVal;             VT_CY DATE date;             VT_DATE&#

14、160;BSTR bstrVal;          VT_BSTR IUnknown FAR* punkVal; VT_UNKNOWN IDispatch FAR* pdispVal; VT_DISPATCH SAFEARRAY FAR* parray;   VT_ARRAY|* unsigned char FAR*

15、 pbVal; VT_BYREF|VT_UI1 short FAR* piVal;       VT_BYREF|VT_I2 long FAR* plVal;        VT_BYREF|VT_I4 float FAR* pfltVal;     VT_BYREF|VT_R4 

16、;double FAR* pdblVal;    VT_BYREF|VT_R8 VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL SCODE FAR* pscode;      VT_BYREF|VT_ERROR CY FAR* pcyVal;        

17、 VT_BYREF|VT_CY DATE FAR* pdate;        VT_BYREF|VT_DATE BSTR FAR* pbstrVal;     VT_BYREF|VT_BSTR IUnknown FAR* FAR* ppunkVal;   VT_BYREF|VT_UNKNOWN IDispatch&#

18、160;FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH SAFEARRAY FAR* FAR* pparray;   VT_ARRAY|* VARIANT FAR* pvarVal;          VT_BYREF|VT_VARIANT void FAR* byref;  

19、60;            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 = &q

20、uot;字符串", v4 = (long)1999;CString str =(BSTR)v3.pbstrVal;long i = v4.lVal;七、其它   對消息的處理中我們經(jīng)常需要將WPARAM或LPARAM等32位數(shù)據(jù)(DWORD)分解成兩個16位數(shù)據(jù)(WORD),如:LPARAM lParam;WORD loValue = LOWORD(lParam);  /取低16位WORD hiValue&

21、#160;= HIWORD(lParam);  /取高16位 對于16位的數(shù)據(jù)(WORD)我們可以用同樣的方法分解成高低兩個8位數(shù)據(jù)(BYTE),如:WORD wValue;BYTE loValue = LOBYTE(wValue);  /取低8位BYTE hiValue = HIBYTE(wValue);  /取高8位 如何將CString類型的變量賦給char*類型的變量1、GetBuffer函數(shù):使用CString:GetBuff

22、er函數(shù)。char *p; CString str="hello" p=str.GetBuffer(str.GetLength(); str.ReleaseBuffer();將CString轉(zhuǎn)換成char * 時CString str("aaaaaaa");strcpy(str.GetBuffer(10),"aa");str.ReleaseBuffer();當我們需要字符數(shù)組時調(diào)用GetBuffer(int n),其中n為我們需要的字符數(shù)組的長度

23、.使用完成后一定要馬上調(diào)用ReleaseBuffer();還有很重要的一點就是,在能使用const char *的地方,就不要使用char *2、memcpy: CString mCS=_T("cxl"); char mch20; memcpy(mch,mCS,20); 3、用LPCTSTR強制轉(zhuǎn)換: 盡量不使用char *ch; CString str; ch=(LPSTR)(LPCTSTR)str; CString

24、0;str = "good"char *tmp;sprintf(tmp,"%s",(LPTSTR)(LPCTSTR)str); 4、CString Msg; Msg=Msg+"abc" LPTSTR lpsz; lpsz = new TCHARMsg.GetLength()+1; _tcscpy(lpsz, Msg); char * psz; strcpy(

25、psz,lpsz); CString類向const char *轉(zhuǎn)換char a100;CString str("aaaaaa");strncpy(a,(LPCTSTR)str,sizeof(a);或:strncpy(a,str,sizeof(a);      以上兩種用法都是正確地. 因為strncpy的第二個參數(shù)類型為const char *.所以編譯器會自動將CString類轉(zhuǎn)換成const char *.CS

26、tring轉(zhuǎn)LPCTSTR (const char *)CString cStr;const char *lpctStr=(LPCTSTR)cStr;LPCTSTR轉(zhuǎn)CStringLPCTSTR lpctStr;CString cStr=lpctStr;將char*類型的變量賦給CString型的變量可以直接賦值,如:    CString myString = "This is a test"&

27、#160;也可如: CString s1("Tom");將CString類型的變量賦給char類型(字符串)的變量1、sprintf()函數(shù)CString str = "good"char tmp200 sprintf(tmp, "%s",(LPCSTR)str); (LPCSTR)str這種強制轉(zhuǎn)換相當于(LPTSTR)(LPCTSTR)str CString類的變量需要轉(zhuǎn)換為(char*)的時,使用(LPTSTR)(LPCTSTR)

28、str     然而LPCTSTR是const char *,也就是說,得到的字符串是不可寫的!將其強制轉(zhuǎn)換成LPTSTR去掉const,是極為危險的!一不留神就會完蛋!要得到char *,應該用GetBuffer()或GetBufferSetLength(),用完后再調(diào)用ReleaseBuffer()。2、strcpy()函數(shù)CString str;char c256;strcpy(c, str); char mychar1024;CString sou

29、rce="Hello"strcpy(char*)&mychar,(LPCTSTR)source); 關(guān)于CString的使用1、指定 CString 形參   對于大多數(shù)需要字符串參數(shù)的函數(shù),最好將函數(shù)原型中的形參指定為一個指向字符(LPCTSTR)而非 CString 的const指針。   當將形參指定為指向字符的const指針時,可將指針傳遞到 TCHAR 數(shù)組(如字符串 "hi there"

30、)或傳遞到 CString 對象。   CString對象將自動轉(zhuǎn)換成LPCTSTR。任何能夠使用LPCTSTR的地方也能夠使用 CString對象。2、如果某個形參將不會被修改,則也將該參數(shù)指定為常數(shù)字符串引用(即const CString&)。如果函數(shù)要修改該字符串,則刪除const修飾符。如果需要默認為空值,則將其初始化為空字符串 "",如下所示:void AddCustomer(const CString& name,const C

31、String& address,const CString& comment = "" ); 3、對于大多數(shù)函數(shù)結(jié)果,按值返回 CString 對象即可。串的基本運算   對于串的基本運算,很多高級語言均提供了相應的運算符或標準的庫函數(shù)來實現(xiàn)。為敘述方便,先定義幾個相關(guān)的變量:  char s120="dir/bin/appl",     &

32、#160; s220="file.asm",       s330,*p;  int result;  下面以C語言中串運算介紹串的基本運算 1、求串長    int strlen(char *s);    /求串s的長度  【例】printf("%d",strlen(s1);  

33、;/輸出s1的串長122、串復制  char *strcpy(char *to,*from);  /將from串復制到to串中,并返回to開始處指針  【例】strcpy(s3,s1); /s3="dir/bin/appl",s1串不變3、聯(lián)接  char *strcat(char *to,char *from);/將from串復制到to串的末尾,       

34、60;           /并返回to串開始處的指針  【例】strcat(s3,"/");  /s3="dir/bin/appl/"    strcat(s3,s2);  /s3="dir/bin/appl/file.asm"4、串比較  int strcmp(char *s1,cha

35、r *s2);/比較s1和s2的大小,  /當s1<s2、s1>s2和s1=s2時,分別返回小于0、大于0和等于0的值   【例】result=strcmp("baker","Baker");  /result>0      result=strcmp("12","12");   /result=0  

36、0;   result=strcmp("Joe","joseph") /result<05、字符定位  char *strchr(char *s,char c);/找c在字符串s中第一次出現(xiàn)的位置,                /若找到,則返回該位置,否則返回NULL  【例】p=

37、strchr(s2,'.');   /p指向"file"之后的位置if(p) strcpy(p,".cpp");  /s2="file.cpp"  注意:  上述操作是最基本的,其中后4個操作還有變種形式:strncpy,strncath和strnchr。  其它的串操作見C的<string.h>。在不同的高級語言中,對串運算的種類及符號都不盡相同  其余的串操作一般可

38、由這些基本操作組合而成  【例】求子串的操作可如下實現(xiàn):  void substr(char *sub,char *s,int pos,int len)    /s和sub是字符數(shù)組,用sub返回串s的第pos個字符起長度為len的子串    /其中0<=pos<=strlen(s)-1,且數(shù)組sub至少可容納len+1個字符。    if (pos<0|po

39、s>strlen(s)-1|len<0)      Error("parameter error!");    strncpy(sub,&spos,len);   /從spos起復制至多l(xiāng)en個字符到sub*c+ 字符類型總結(jié)1.區(qū)別wchar_t,char,WCHAR  ANSI:即char,可用字符串處理函數(shù):strcat( ),strcpy( ), s

40、trlen( )等以str打頭的函數(shù)。  UNICODE:wchar_t是Unicode字符的數(shù)據(jù)類型,它實際定義在里:  typedef unsigned short wchar_t;  另外,在頭文件中有這樣的定義:typedef wchar_t WCHAR; 所以WCHAR實際就是wchar_t。  wchar_t可用字符串處理函數(shù):wcscat(),wcscpy(),wcslen()等以wcs打頭的函數(shù)。為了讓編譯器識別Unicode字符

41、串,必須以在前面加一個“L”,例如: wchar_t *szTest=L"This is a Unicode string."2.TCHAR  在C語言里面提供了_UNICODE宏(有下劃線),在Windows里面提供了UNICODE宏(無下劃線),只要定了_UNICODE宏和UNICODE宏,系統(tǒng)就會自動切換到UNICODE版本,否則,系統(tǒng)按照ANSI的方式進行編譯和運行。只定義了宏并不能實現(xiàn)自動的轉(zhuǎn)換,還需要一系列的字符定義支持。  1 TCHAR &

42、#160;如果定義了UNICODE宏則TCHAR被定義為wchar_t。  typedef wchar_t TCHAR;  否則TCHAR被定義為char typedef char TCHAR;  2 LPTSTR  如果定義了UNICODE宏則LPTSTR被定義為LPWSTR。  typedef LPTSTR LPWSTR;  否則TCHAR被定義為char typedef 

43、LPTSTR LPSTR;  說明:在使用字符串常量的時候需要使用_TEXT(“MyStr”)或_T("")來支持系統(tǒng)的自動轉(zhuǎn)換。3.BSTR  BSTR是一個帶長度前綴的字符串,主要由操作系統(tǒng)來管理的,所以要用api.主要用來和VB打交道的(VB里的string就是指它)要操作它的API函數(shù)有很多.比如SysAllocString,SysFreeString等等.  vc里封裝它的類如_bstr_t,及ATL中的CComBSTR等.   一個BSTR由頭部和字符串組成,頭部

44、包含了字符串的長度信息,字符串中可以包含嵌入的 null 值。   BSTR是以指針的形式進行傳遞的。(指針是一個變量,包含另外一個變量的內(nèi)存地址,而不是數(shù)據(jù)。) BSTR是Unicode的,即每個字符需要兩個字節(jié)。BSTR通常以兩字節(jié)的 null 字符結(jié)束。 wstr是寬字符,以雙字節(jié)表示一個字符 bstr是為了與原先的basic字符兼容,它的最前面的4個字節(jié)為其長度,以'0'結(jié)束.4.更進一步的字符串以及其指針的類型定義   由于Win32API

45、文檔的函數(shù)列表使用函數(shù)的常用名字(如, "SetWindowText"),所有的字符串都是用TCHAR來定義的。(除了XP中引入的只適用于Unicode的API)。下面列出一些常用的typedefs,你可以在msdn中看到他們。type       Meaning in MBCS builds      Meaning in Unicode builds WCHAR&

46、#160;      wchar_t                         wchar_t LPSTR       char*      &

47、#160;                    char* LPCSTR      const char*                 

48、0;   const char* LPWSTR      wchar_t*                        wchar_t* LPCWSTR     wchar_t* 

49、;                       wchar_t* TCHAR       TCHAR                

50、;           char wchar_t LPTSTR      TCHAR*                          TCHAR*

51、 LPCTSTR     const TCHAR*                    const TCHAR* 5.相互轉(zhuǎn)換(1) char*轉(zhuǎn)換成CString若將char*轉(zhuǎn)換成CString,除了直接賦值外,還可使用CString:Format進行。如:char chArray&

52、#160;= "This is a test"char * p = "This is a test"或LPSTR p = "This is a test"或在已定義Unicode應的用程序中TCHAR * p = _T("This is a test");或LPTSTR 

53、;p = _T("This is a test");CString theString = chArray;theString.Format(_T("%s"), chArray);theString = p;(2) CString轉(zhuǎn)換成char*  若將CString類轉(zhuǎn)換成char*(LPSTR)類型,常使用下列三種方法:1,使用強制轉(zhuǎn)換。如:CString theString( "T

54、his is a test" );LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; 2,使用strcpy。如:CString theString( "This is a test" );LPTSTR lpsz = new TCHARtheString.GetLength()+1;_tcscpy(lpsz, theString);需要說明的是,strcpy(

55、或可移值Unicode/MBCS的_tcscpy)的第二個參數(shù)是 const wchar_t* (Unicode)或const char* (ANSI),系統(tǒng)編譯器將會自動對其進行轉(zhuǎn)換。3,使用CString:GetBuffer。如:CString s(_T("This is a test ");LPTSTR p = s.GetBuffer();/ 在這里添加使用p的代碼if(p != NULL) *p&#

56、160;= _T('0');s.ReleaseBuffer();/ 使用完后及時釋放,以便能使用其它的CString成員函數(shù)(3) BSTR轉(zhuǎn)換成char*方法一,使用ConvertBSTRToString。例如:#include#pragma comment(lib, "comsupp.lib")int _tmain(int argc, _TCHAR* argv)    BSTR bstrText =

57、0;:SysAllocString(L"Test");    char* lpszText2 = _com_util:ConvertBSTRToString(bstrText);    SysFreeString(bstrText); / 用完釋放    delete lpszText2;    return 0; 方法二,使用_bstr

58、_t的賦值運算符重載。例如:   _bstr_t b = bstrText;   char* lpszText2 = b;(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 strVar("This is a test");_variant_t strVar("This is

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論