首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 字符大小寫轉換:標準庫、API、手寫實現與性能大比拼

     編輯:關於C++

轉換函數分類

1. C 庫函數(<ctype.h> / <cctype>)

  • int toupper(int c)、int tolower(int c):單字符轉換,受當前 locale 影響。
  • int toupper_l(int c, locale_t loc) 等 _l 版本:指定 locale。
  • 寬字符版:towupper、towlower(效率極低,不推薦)。
  • 無整串轉換函數,需逐字符循環。

2. C++ 庫安全函數(MSVC <string.h> / <cstring>)

  • errno_t _strlwr_s(char* str, size_t n)、_strupr_s:原地轉換整個以空字符結尾的字符串,帶緩衝區長度檢查。
  • 寬字符版:_wcslwr_s、_wcsupr_s。
  • 模板重載:_strlwr_s(arr) 自動推導數組大小。

3. Windows API(<windows.h>)

  • CharUpper/CharLower(LPTSTR):原地轉換字符串。
  • CharUpperBuff/CharLowerBuff(LPTSTR, DWORD):指定長度轉換。
  • A/W 後綴區分 ANSI/Unicode:CharUpperA、CharUpperW。
  • 功能最全(支持本地化、特殊語言規則),但調用開銷大。

4. STL 算法(<algorithm>)

transform(s.begin(), s.end(), s.begin(), ::toupper);  // 全大寫
transform(s.begin(), s.end(), s.begin(), ::tolower);  // 全小寫
  • 通用、優雅,但需注意 ::toupper 簽名匹配(接受 int 返回 int,隱式轉換)。
  • 可配合自定義轉換函數對象。

5. 手寫位運算實現(僅 ASCII 字母,最高效)

inline char toUpperAscii(char c) {
    return (c >= 'a' && c <= 'z') ? (c & 0xDF) : c;  // 0xDF = 0b11011111
}
inline char toLowerAscii(char c) {
    return (c >= 'A' && c <= 'Z') ? (c | 0x20) : c;  // 0x20 = 0b00100000
}
inline wchar_t toUpperAscii(wchar_t c) {
    return (c >= L'a' && c <= L'z') ? (c & 0x00DF) : c;
}
inline wchar_t toLowerAscii(wchar_t c) {
    return (c >= L'A' && c <= L'Z') ? (c | 0x0020) : c;
}
// 整串轉換
void strToUpper(char* s) { for (; *s; ++s) *s = toUpperAscii(*s); }
void strToLower(char* s) { for (; *s; ++s) *s = toLowerAscii(*s); }
  • 原理:ASCII 字母大小寫第 5 位(0x20)不同,大寫為 0,小寫為 1。
  • 僅適用於 ASCII 字母,非字母字符原樣返回。
  • 無分支預測失誤、無函數調用開銷、極易內聯。

性能測試(100 萬次循環,1024 字節字符串)

方法耗時 (ms)相對速度
直接位運算(不判斷範圍)~10771.00x (基準)
手寫帶範圍判斷~36663.4x
STL transform + 自定義函數~32923.1x
C 庫 toupper/tolower~61935.7x
C++ 庫 _strupr_s/_strlwr_s~59125.5x
STL transform + ::toupper~61465.7x
Windows API CharUpperBuff~1388412.9x

選擇建議

  1. 確定輸入純 ASCII 字母:直接位運算(c & 0xDF / c | 0x20),最快。
  2. 一般情況(含非字母、需保持非字母不變):手寫帶範圍判斷版本,性能優秀且正確。
  3. 需支持本地化(如德語 ß→SS、土耳其語 İ/i):Windows API 或 C 庫 towupper_l 配合 locale。
  4. 代碼簡潔優先、性能非瓶頸:std::transform + ::toupper。

實戰案例:URL 處理性能優化 60%

某項目中 URL 歸一化(轉小寫)佔用大量 CPU。將 std::transform(::tolower) 替換為手寫 toLowerAscii 循環,性能提升 60%,延遲從毫秒級降至微秒級。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved