字符/字符串中一些需要注意的點

基本準(zhǔn)則
  • 將文本字符想象成字符的數(shù)組,而不是char或字節(jié)的數(shù)組。
  • 用通用的數(shù)據(jù)類型來表示文本字符和字符串。
  • 用明確的數(shù)據(jù)類型來表示字節(jié)、字節(jié)指針和數(shù)據(jù)緩沖區(qū)。
  • 用TEXT或_T來表示字面量字符和字符串,但要注意,避免兩者混用。
  • 執(zhí)行全局替換。
  • 修改與字符串有關(guān)的計算。
    緩沖區(qū)大小的字符數(shù):_countof(szBuffer)
    字節(jié)數(shù):sizeof(szBuffer)
    內(nèi)存是以字節(jié)來分配的,所以在給一個字符串申請內(nèi)存塊的時候,用的是malloc(mCharacters*sizeof(TCHAR)),一定要記住,需要乘數(shù)據(jù)類型的大??!
  • 避免使用printf系列函數(shù),尤其是不要用%s和%S字段類型來進行ANSI和Unicode字符串之間的相互轉(zhuǎn)換。正確:MultiByteToWideChar和WideCharToMultiByte
int MultiByteToWideChar(
  _In_      UINT   CodePage,//標(biāo)識了與多字節(jié)字符串關(guān)聯(lián)的一個代碼頁值
  _In_      DWORD  dwFlags,//額外的控制,一般不使用這個標(biāo)識,所以傳0
  _In_      LPCSTR lpMultiByteStr,//要轉(zhuǎn)換的字符串
  _In_      int    cbMultiByte,//指定字符串的長度(如果是-1,則函數(shù)自動判斷源字符串的長度)
  _Out_opt_ LPWSTR lpWideCharStr,//指定Unicode版本的字符串寫入內(nèi)存緩沖區(qū)的地址
  _In_      int    cchWideChar//制定要寫入的緩沖區(qū)的最大長度。(如果這個參數(shù)傳0,那么函數(shù)就不會執(zhí)行轉(zhuǎn)換,而是返回一個寬字符(包括終止符),只有緩沖區(qū)能夠容納該數(shù)量的寬字符,轉(zhuǎn)換才會成功)
);
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ù)就會使用一個這個參數(shù)指向的字符,而不是系統(tǒng)默認(rèn)的字符(通常是?,超級不安全)。
  _Out_opt_ LPBOOL  lpUsedDefaultChar//如果至少有一個字符不能轉(zhuǎn)換為對應(yīng)的多字節(jié)形式,那么這個參數(shù)就會被設(shè)為TRUE;所有都轉(zhuǎn)換成功,這個變量就會被設(shè)為FALSE。這個參數(shù)通常傳NULL。
);
  • UNICODE和UNICODE要么同時指定要么都不指定。
字符串操作準(zhǔn)則
  • 始終使用安全的字符串處理函數(shù),比如后綴為s的函數(shù)和前綴為StringCch的系列函數(shù)。后者主要是在我們想明確控制截斷的時候使用,如果不想明確控制截斷,則首選前者。
  • 盡量不要使用不安全的c運行庫字符串處理函數(shù)。如果一個緩沖區(qū)處理函數(shù)的參數(shù)中不包括目標(biāo)緩沖區(qū)的長度,那么我們應(yīng)該避免使用/自己實現(xiàn)這樣的函數(shù),使用相應(yīng)的替代函數(shù)。
  • 不要用Kernel32方法來進行字符串處理。比如lstrcat和lstrcpy
  • 比較兩種字符串。
    程序字符串(包括文件名、路徑、XML元素/屬性以及注冊表項/值等)用CompareStringOrdinal來進行比較(因為它非常快,而且不會考慮用戶的區(qū)域設(shè)置)。
    CompareString(Ex)用來比較用戶字符串(要在用戶界面上顯示),因為在比較字符串的時候,這個函數(shù)會考慮用戶的區(qū)域設(shè)置。
int CompareString(
  _In_ LCID    Locale,//指定一個區(qū)域設(shè)置ID(一個32位值),用來標(biāo)識一種語言。
  _In_ DWORD   dwCmpFlags,//一組標(biāo)志,比較字符串時的方法。
  _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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容