小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

VC 函數(shù)含義及編碼轉(zhuǎn)換

 一世的追逐 2012-05-24
字符串有好幾種不同的類型,新手一開始學(xué)的一定是char,這種是最基礎(chǔ)的字符串,用ASCII碼來(lái)表示英文,這個(gè)叫做ANSI編碼?,F(xiàn)在新寫程序都應(yīng)當(dāng)使用寬字符,類型是wchar_t,一個(gè)wchar_t占兩個(gè)字節(jié),不管英文還是中文,這種編碼是一種Unicode編碼,Unicode編碼的程序即使拿到其他語(yǔ)言的系統(tǒng)上運(yùn)行也能正確顯示,前提是那個(gè)系統(tǒng)安裝了中文字體。還有一種是MBCS,翻譯成中文就是多字節(jié)字符串,一個(gè)字符有多個(gè)字節(jié)組成,不一定是2字節(jié)也可以多余兩字節(jié),GB2312,UTF8等都屬此類。
編譯器是不能自動(dòng)轉(zhuǎn)換char和wchar_t的,因?yàn)樗麄冎g的轉(zhuǎn)換必須要指定代碼頁(yè)。
微軟提供了一系列的函數(shù)來(lái)對(duì)應(yīng)操作這些字符串,你只要在msdn搜一個(gè)strlen,他下面會(huì)列出比如wstrlen,w開頭的用來(lái)操作wchar_t,mb開通的用來(lái)操作MBCS等。
值得一提的是一組_t開頭的,這是一種“自適應(yīng)”的函數(shù),在Visual Studio的工程選項(xiàng)里面可以選擇應(yīng)用程序編碼使用Unicode還是普通的,那么這個(gè)_t就會(huì)自動(dòng)適應(yīng)這個(gè)選項(xiàng),比如_tcslen在選項(xiàng)為Unicode的時(shí)候自動(dòng)執(zhí)行wstrlen,在選項(xiàng)為ANSI編碼的時(shí)候執(zhí)行strlen。
再說(shuō)一下Windows API有關(guān)字符串類型的定義,常見的有這么幾個(gè)
#define  LPSTR    char*
#define  LPCSTR  const char*
#define  LPTSTR  TCHAR*
#define  LPCTSTR  const TCHAR*
#define  LPWSTR   wchar_t*
#define  LPCWSTR  const wchar_t*
你仔細(xì)看一下就找到了規(guī)律,LP是指針,微軟的傳統(tǒng),STR表示字符串,C表示const,T表示TCHAR,W表示wchar_t。
最后說(shuō)一下TCHAR,TCHAR和前面說(shuō)的_tcslen有一樣的作用,他是這么定義的
#ifdef _UNICODE
#define TCHAR   wchar_t
#else
#define  TCHAR char
#endif
也就是根據(jù)編譯器的自動(dòng)適應(yīng)。
最后很重要的一點(diǎn)是你在程序里面怎么表示char和wchar_t的字符串。
最熟悉的就是拿引號(hào)包括在字符串兩邊,這樣表示這個(gè)字符串是char類型的:
LPCSTR sz = "Some characters";
這個(gè)是不能付給需要wchar_t的地方的,比如你寫wprintf(sz)就是錯(cuò)的,編譯器會(huì)報(bào)錯(cuò)不能從const char*轉(zhuǎn)成const wchar_t*。寫寬字符字符串必須在引號(hào)前加一個(gè)L,如
LPCWSTR szw = L"Wide characters";
這樣wprintf(szw)就正確了。
為了自適應(yīng)TCHAR的需要,微軟有定義了一個(gè)宏,_T,這個(gè)宏包括在字符串的變
LPCTSTR tsz = _T("adaptive characters");
這樣的字符串會(huì)根據(jù)編譯器的選項(xiàng)自動(dòng)加L或者不加。

然后那些函數(shù)里面的n,比如strncpy還有類似的后面帶_s的,strcpy_s,這又是完全另外一個(gè)問(wèn)題。原因是原始的C語(yǔ)言庫(kù)比如strcpy很容易導(dǎo)致緩沖區(qū)溢出,你很容易寫出這樣的語(yǔ)句
char sz[5];
strcpy(sz, "something to copy");
這個(gè)語(yǔ)句完全通過(guò)編譯,但是他有嚴(yán)重的問(wèn)題,sz的長(zhǎng)度不足以復(fù)制那整個(gè)字符串,而strcpy卻不知道,因此它就會(huì)試圖去修改超過(guò)緩沖區(qū)的內(nèi)容,導(dǎo)致緩沖區(qū)溢出,緩沖區(qū)溢出是很廣泛的漏洞,原始的C語(yǔ)言庫(kù)無(wú)法避免的這問(wèn)題,有時(shí)候你接受用戶的輸入,你沒(méi)法知道用戶會(huì)輸入多少數(shù)據(jù)。
因?yàn)楝F(xiàn)在有了strncpy, strcpy_s以及比如scanf_s, gets_s等幾乎所有的標(biāo)準(zhǔn)庫(kù)函數(shù)都帶了一個(gè)或多個(gè)變形的版本,這些版本基本就只多了一個(gè)參數(shù),就是你給這個(gè)函數(shù)的緩沖區(qū)大小。比如剛才的例子:
strcpy_s(sz, 5, "ssdfsfdsfsf");
這個(gè)代碼在Debug版本運(yùn)行的時(shí)候就會(huì)跳出Runtime Error告訴你Buffer to small,在Release版本不會(huì)跳錯(cuò),但是它會(huì)截?cái)嗄阋獜?fù)制的字符串到緩沖區(qū)的大小,保證不會(huì)發(fā)生緩沖區(qū)溢出。
新編寫嚴(yán)肅的程序都應(yīng)當(dāng)使用安全版本的函數(shù),s可以理解是safety的縮寫?,F(xiàn)在微軟的編譯器在你使用strcpy這樣不安全的函數(shù)的時(shí)候會(huì)提出警告。

帶l的函數(shù)就是可以設(shè)置一個(gè)字符語(yǔ)言的區(qū)域,沒(méi)有l(wèi)的函數(shù)就是使用操作系統(tǒng)默認(rèn)的語(yǔ)言設(shè)置。

    本站是提供個(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)論公約

    類似文章 更多