基本準(zhǔn)則
- 將文本字符想象成字符的數(shù)組,而不是char或字節(jié)的數(shù)組。
- 用通用的數(shù)據(jù)類型來(lái)表示文本字符和字符串撩穿。
- 用明確的數(shù)據(jù)類型來(lái)表示字節(jié)、字節(jié)指針和數(shù)據(jù)緩沖區(qū)谒撼。
- 用TEXT或_T來(lái)表示字面量字符和字符串食寡,但要注意,避免兩者混用嗤栓。
- 執(zhí)行全局替換冻河。
- 修改與字符串有關(guān)的計(jì)算。
緩沖區(qū)大小的字符數(shù):_countof(szBuffer)
字節(jié)數(shù):sizeof(szBuffer)
內(nèi)存是以字節(jié)來(lái)分配的茉帅,所以在給一個(gè)字符串申請(qǐng)內(nèi)存塊的時(shí)候叨叙,用的是malloc(mCharacters*sizeof(TCHAR)),一定要記住堪澎,需要乘數(shù)據(jù)類型的大欣薮怼!
- 避免使用printf系列函數(shù)樱蛤,尤其是不要用%s和%S字段類型來(lái)進(jìn)行ANSI和Unicode字符串之間的相互轉(zhuǎn)換钮呀。正確:MultiByteToWideChar和WideCharToMultiByte
int MultiByteToWideChar(
_In_ UINT CodePage,//標(biāo)識(shí)了與多字節(jié)字符串關(guān)聯(lián)的一個(gè)代碼頁(yè)值
_In_ DWORD dwFlags,//額外的控制,一般不使用這個(gè)標(biāo)識(shí)昨凡,所以傳0
_In_ LPCSTR lpMultiByteStr,//要轉(zhuǎn)換的字符串
_In_ int cbMultiByte,//指定字符串的長(zhǎng)度(如果是-1爽醋,則函數(shù)自動(dòng)判斷源字符串的長(zhǎng)度)
_Out_opt_ LPWSTR lpWideCharStr,//指定Unicode版本的字符串寫入內(nèi)存緩沖區(qū)的地址
_In_ int cchWideChar//制定要寫入的緩沖區(qū)的最大長(zhǎng)度。(如果這個(gè)參數(shù)傳0便脊,那么函數(shù)就不會(huì)執(zhí)行轉(zhuǎn)換蚂四,而是返回一個(gè)寬字符(包括終止符),只有緩沖區(qū)能夠容納該數(shù)量的寬字符哪痰,轉(zhuǎn)換才會(huì)成功)
);
int WideCharToMultiByte(
_In_ UINT CodePage,
_In_ DWORD dwFlags,
_In_ LPCWSTR lpWideCharStr,
_In_ int cchWideChar,
_Out_opt_ LPSTR lpMultiByteStr,
_In_ int cbMultiByte,
_In_opt_ LPCSTR lpDefaultChar,//如果遇到不能轉(zhuǎn)換的寬字符遂赠,函數(shù)就會(huì)使用一個(gè)這個(gè)參數(shù)指向的字符,而不是系統(tǒng)默認(rèn)的字符(通常是晌杰?跷睦,超級(jí)不安全)。
_Out_opt_ LPBOOL lpUsedDefaultChar//如果至少有一個(gè)字符不能轉(zhuǎn)換為對(duì)應(yīng)的多字節(jié)形式肋演,那么這個(gè)參數(shù)就會(huì)被設(shè)為TRUE;所有都轉(zhuǎn)換成功抑诸,這個(gè)變量就會(huì)被設(shè)為FALSE烂琴。這個(gè)參數(shù)通常傳NULL。
);
- UNICODE和UNICODE要么同時(shí)指定要么都不指定哼鬓。
字符串操作準(zhǔn)則
- 始終使用安全的字符串處理函數(shù)监右,比如后綴為s的函數(shù)和前綴為StringCch的系列函數(shù)边灭。后者主要是在我們想明確控制截?cái)嗟臅r(shí)候使用异希,如果不想明確控制截?cái)啵瑒t首選前者绒瘦。
- 盡量不要使用不安全的c運(yùn)行庫(kù)字符串處理函數(shù)称簿。如果一個(gè)緩沖區(qū)處理函數(shù)的參數(shù)中不包括目標(biāo)緩沖區(qū)的長(zhǎng)度,那么我們應(yīng)該避免使用/自己實(shí)現(xiàn)這樣的函數(shù)惰帽,使用相應(yīng)的替代函數(shù)憨降。
- 不要用Kernel32方法來(lái)進(jìn)行字符串處理。比如lstrcat和lstrcpy
- 比較兩種字符串该酗。
程序字符串(包括文件名授药、路徑、XML元素/屬性以及注冊(cè)表項(xiàng)/值等)用CompareStringOrdinal來(lái)進(jìn)行比較(因?yàn)樗浅呜魄?旎谶矗也粫?huì)考慮用戶的區(qū)域設(shè)置)。
CompareString(Ex)用來(lái)比較用戶字符串(要在用戶界面上顯示)爵嗅,因?yàn)樵诒容^字符串的時(shí)候娇澎,這個(gè)函數(shù)會(huì)考慮用戶的區(qū)域設(shè)置。
int CompareString(
_In_ LCID Locale,//指定一個(gè)區(qū)域設(shè)置ID(一個(gè)32位值)睹晒,用來(lái)標(biāo)識(shí)一種語(yǔ)言趟庄。
_In_ DWORD dwCmpFlags,//一組標(biāo)志,比較字符串時(shí)的方法伪很。
_In_ LPCTSTR lpString1,
_In_ int cchCount1,
_In_ LPCTSTR lpString2,
_In_ int cchCount2
);
int CompareStringEx(
_In_opt_ LPCWSTR lpLocaleName,
_In_ DWORD dwCmpFlags,
_In_ LPCWSTR lpString1,
_In_ int cchCount1,
_In_ LPCWSTR lpString2,
_In_ int cchCount2,
_In_opt_ LPNLSVERSIONINFO lpVersionInformation,
_In_opt_ LPVOID lpReserved,
_In_opt_ LPARAM lParam
);
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者