免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

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

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

帶l的函數(shù)就是可以設(shè)置一個字符語言的區(qū)域,沒有l(wèi)的函數(shù)就是使用操作系統(tǒng)默認(rèn)的語言設(shè)置。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Ansi與Unicode簡要說明及各自的優(yōu)缺點
(const) char *轉(zhuǎn)CString 詳解(字符串類型轉(zhuǎn)換詳解,不斷補充)
TCHAR char wchar
帶你玩轉(zhuǎn)Visual Studio——帶你理解多字節(jié)編碼與Unicode碼
VC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解
VC Windows平臺字符透明編程大總結(jié)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服