乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Windows字符串類型 CHAR* WCHAR* LPSTR LPCSTR

       tianht 2015-04-22

      基于windows編程開發(fā),字符類型肯定是少不了的,收集整理一下關(guān)于 windows下的基本類型,以便遺忘查看.

       

      C++主要使用的是C-Style字符串,而M$在Windows中又增加了很多C-Style字符串的變體。這個(gè)一多嘛,就容易亂~

        所謂字符串,就是由字符組合而成,所以我們先來(lái)查看一下字符類型。

        首先,存在兩種最基本的字符類型:char和wchar_t。char大家都很熟悉了,我就跳過(guò)。至于wchar_t,是應(yīng)用于UNICODE的寬字符,即一個(gè)字符2Bytes,16Bits。事實(shí)上,Windows中利用
      typedef unsigned short wchar_t
      定義wchar_t

        然后為了書寫方便(MS我也沒(méi)覺得有多大差別),M$又把那兩個(gè)基本字符類型重新的給他typedef了一遍,即:
      typedef char CHAR
      typedef wchar_t WCHAR
      為了使得兼容性更加,M$又定義了TCHAR數(shù)據(jù)類型:

      #ifdef UNIOCDE
        
      typedef WCHAR TCHAR
      #else
        typedef 
      CHAR TCHAR
      #end if

       

      這樣,你不用關(guān)心是要使用ANSI字符串還是Unicode,編譯器會(huì)自動(dòng)根據(jù)你的OS來(lái)選擇。

      說(shuō)明:
      1、UNICODE宏在C/C++中分別是 _UNICODE宏(有下劃線)/ UNICODE宏(無(wú)下劃線)。

      2、在使用字符串常量的時(shí)候需要使用_TEXT(“TStr”)或者_(dá)T("TStr")來(lái)支持系統(tǒng)的自動(dòng)轉(zhuǎn)換。



        然后,M$又利用上面的幾種基本數(shù)據(jù)類型,定義了一些字符串指針類型。
      LPSTR和LPCSTR:LPSTR是指向以0結(jié)尾的ANSI字符串的指針,后者是const指針

      typedef CHARLPSTR
      typedef const CHARLPCSTR
      LPWSTR和LPCWSTR:LPWSTR是指向以0結(jié)尾的UNICODE字符串的指針,后者是const指針
      typedef WCHARLPWSTR
      typedef const WCHARLPCWSTR
      同樣,為了擺脫對(duì)ANSI還是UNICODE的選擇麻煩,M$也增加了LPTSTR和LPCTSTR兩個(gè)字符串指針類型。他們被如下定義:
      typedef TCHARLPTSTR

      #ifdef UNICODE
        
      typedef LPSTR LPTSTR
      #else
        typedef 
      LPWSTR LPTSTR
      #endif
      /////////////////////////////////////
      typedef const TCHARLPCTSTR

      #ifdef UNICODE
        
      typedef LPCSTR LPCTSTR
      #else
        typedef 
      LPCWSTR LPCTSTR
      #endif

      ps:你會(huì)在某些地方看到存在PSTR/PWSTR/PTSTR等等,與上面的只卻一個(gè)L的字符串指針類型。實(shí)際上,這個(gè)是長(zhǎng)指針和短指針問(wèn)題。LPXX是長(zhǎng)指針,PXX是短指針。不過(guò)在32Bit的系統(tǒng)上,二者已經(jīng)沒(méi)有區(qū)別。

      BSTR:

      BSTR是為了與原先的basic字符兼容。主要用來(lái)和VB打交道的(VB里的string就是指它)。一個(gè) BSTR 由頭部和字符串組成,頭部4字節(jié)包含串長(zhǎng)信息,串中可以包含嵌入的 null 值。這種帶長(zhǎng)度前綴的字符串,主要由操作系統(tǒng)來(lái)管理的,所以要用api.操作它的API函數(shù)很多,如SysAllocString,SysFreeString等.
      vc里封裝它的類如_bstr_t,及ATL中的CComBSTR等.
      BSTR 是以指針的形式進(jìn)行傳遞的。
      BSTR 是 Unicode 的,即每個(gè)字符需要兩個(gè)字節(jié)。 
      BSTR 通常以兩字節(jié)的 null 字符結(jié)束。 


      然后說(shuō)說(shuō)兩個(gè)比較成熟好用的字符串類型:String和CString
      String是C++的標(biāo)準(zhǔn)字符串,需要string(不帶.h)頭文件和std名字空間支持。
      CString是M$為MFC設(shè)計(jì)的字符串,功能更加強(qiáng)大,而且這玩意兒是安全的。需要atlstr.h文件和MFC DLL的支持。不過(guò)目前已經(jīng)有人將此類型從MFC中分離~

       

       

       為了增強(qiáng)程序的通用性,還必須注意以下幾點(diǎn):

      cLPTSTR、LPCSTR、LPCTSTR、LPSTR的意義:
      LPSTR:32bit指針 指向一個(gè)字符串,每個(gè)字符占1字節(jié)
      LPCSTR:32-bit指針 指向一個(gè)常字符串,每個(gè)字符占1字節(jié)
      LPCTSTR:32-bit指針 指向一個(gè)常字符串,每字符可能占1字節(jié)或2字節(jié),取決于Unicode宏是否定義
      LPTSTR:32-bit指針 每字符可能占1字節(jié)或2字節(jié),取決于Unicode宏是否定義

      1、既然程序里不能出現(xiàn)char,那表示字符串時(shí),就不能再習(xí)慣性的用char*了。應(yīng)該改為TCHAR*,或者是PTSTR。后一種是 windows的變量,類似的有:PSTR、PTSTR、LPTSTR、LPSTR、PCTSTR等等等等。這也是讓人一開始接觸會(huì)頭大的地方。其實(shí)并非如此恐怖,我以PCTSTR為例做個(gè)解釋:P代表指針(和LP是一個(gè)東西,LP的本意是Long Pointer,16位windows時(shí)代的遺留物。),C代表const,T代表TCHAR,STR代表字符串。所以PCTSTR其實(shí)就是const TCHAR* 的意思。而PSTR也就是char* 的意思。所以我們?cè)诒硎咀址畷r(shí)也不能使用PSTR等不帶T的變量類型名。

      2、表示字符串常量時(shí),不能簡(jiǎn)單的用雙引號(hào)括起來(lái),因?yàn)槟谴韆scii字符串。同樣也不能在前面加L,因?yàn)槟谴韚nicode。我們的程序要做到的是通用性,即不是ascii也不是unicode。所以我們?cè)谧址皯?yīng)該加的是TEXT,比如MessageBox(NULL,TEXT("Fypher"),TEXT("FF"),MB_OK)。TEXT還可用于字符。比如TCHAR m=TEXT('A');

      3、TCHAR FF[50]。FF能裝多少字符?哈!不要習(xí)慣性的sizeof(FF)了,應(yīng)該_countof(FF)或者sizeof(FF)/sizeof(TCHAR)。因?yàn)槲覀儾淮_定TCHAR到底是char 還是 wchar_t。

      4、該和一堆老朋友說(shuō)再見了……我們不能再使用以前的字符串處理函數(shù)或者字符處理函數(shù)了。比如strlen、strcat、strcmp等等等等……因?yàn)檫@些是ascii專用的,通通改成使用T家族的吧。前綴都換成_tcs。比如_tcslen、_tcscat、_tcscmp等等……順便補(bǔ)充一下wcs前綴是wchar_t使用的。恩,還有大家用得超爽的sprintf,今后就改成_stprintf了吧~呵呵。補(bǔ)充:swprintf是 wchar_t它家的。對(duì)了,windows認(rèn)為_tcscpy、_tcscat等不安全,所以使用這些函數(shù)編譯器會(huì)報(bào)警??梢愿挠脀indows推出的 _tcscpy_s、_tcscat_s等“安全”函數(shù),其實(shí)就是多了個(gè)參數(shù)用來(lái)指明緩沖區(qū)大?。ㄓ浀糜胈countof哦~!^_^)。windows 還推出了形如StringCchCat的一套字符串處理函數(shù),我沒(méi)怎么用過(guò)。windows也有一個(gè)字符串比較函數(shù)CompareString。功能比 _tcscmp強(qiáng)大多了。比如可以設(shè)置忽略大小寫等。

      5、IsTextUnicode函數(shù)可以用過(guò)一系列統(tǒng)計(jì)學(xué)的方法判斷某個(gè)字符串是不是unicode字符串。 MultiByteToWideChar和WideCharToMultiByte函數(shù)可實(shí)現(xiàn)Ascii和Unicode字符串的相互轉(zhuǎn)化。這些的使用場(chǎng)合都不大。因?yàn)槲覀兊某绦驊?yīng)該做到“沒(méi)有”ascii和unicode。

      6、恩,雖然絕大多數(shù)情況下應(yīng)該使用TCHAR,但是記住GetProcAdress這個(gè)特殊的函數(shù)吧,它的參數(shù)只能是char*。因?yàn)樵趯?dǎo)出函數(shù)表里函數(shù)名是用ascii碼寫的……

      7、最后一點(diǎn),記得要#include <tchar.h>哦!呵呵~ 由于windows內(nèi)核采用的是UNICODE,UNICODE版的程序必然比ASCII版的程序效率高(比如不用在調(diào)用函數(shù)時(shí)在堆里分配空間把參數(shù)轉(zhuǎn)成 UNICODE,然后再調(diào)用UNICODE版的函數(shù)),所以我們最好是在程序的開頭加上#define UNICODE和#define _UNICODE,把程序轉(zhuǎn)換成UNICODE版的。如果程序的字符串處理完全按照上面的通用性要求做了是不會(huì)出錯(cuò)的。

      8、注意:str前綴與wcs前綴都是標(biāo)準(zhǔn)C函數(shù),需要有標(biāo)準(zhǔn)C運(yùn)行庫(kù)才能夠使用。而lstr前綴的是window提供的原生函數(shù),不需標(biāo)準(zhǔn)C運(yùn)行庫(kù)。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多