字符/字符串中一些需要注意的點(diǎn)

基本準(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)系作者
  • 序言:七十年代末戚啥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锉试,更是在濱河造成了極大的恐慌猫十,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件键痛,死亡現(xiàn)場(chǎng)離奇詭異炫彩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)絮短,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門江兢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人丁频,你說我怎么就攤上這事杉允∫靥” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵叔磷,是天一觀的道長(zhǎng)拢驾。 經(jīng)常有香客問我,道長(zhǎng)改基,這世上最難降的妖魔是什么繁疤? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮秕狰,結(jié)果婚禮上稠腊,老公的妹妹穿的比我還像新娘。我一直安慰自己鸣哀,他們只是感情好架忌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著我衬,像睡著了一般叹放。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挠羔,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天井仰,我揣著相機(jī)與錄音,去河邊找鬼褥赊。 笑死糕档,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拌喉。 我是一名探鬼主播速那,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尿背!你這毒婦竟也來(lái)了端仰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤田藐,失蹤者是張志新(化名)和其女友劉穎荔烧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汽久,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹤竭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了景醇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臀稚。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖三痰,靈堂內(nèi)的尸體忽然破棺而出吧寺,到底是詐尸還是另有隱情窜管,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布稚机,位于F島的核電站幕帆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赖条。R本人自食惡果不足惜失乾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谋币。 院中可真熱鬧仗扬,春花似錦、人聲如沸蕾额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诅蝶。三九已至,卻和暖如春募壕,著一層夾襖步出監(jiān)牢的瞬間调炬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工舱馅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缰泡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓代嗤,卻偏偏與公主長(zhǎng)得像棘钞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子干毅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容