字串處理是 C/C++ 開發的高頻需求。本文系統整理 <string.h>、<ctype.h> 標準庫函數、記憶體操作函數、常見陷阱,並補充 C++ std::string 核心介面與最佳實踐,提供一站式查閱。
<string.h> 核心字串函數分類速查| 分類 | 函數 | 用途 | 備註 |
|---|---|---|---|
| 複製/串接 | strcpy | 完整複製 | 目標空間需足夠 |
strncpy | 指定長度複製 | 不足補 \0,超長不自動加終結符 | |
strcat | 串接 | 覆蓋目標尾部 \0 | |
strncat | 指定長度串接 | 自動補 \0 | |
| 比較 | strcmp | 全長比較 | 返回 <0,=0,>0 |
strncmp | 前 n 字元比較 | ||
stricmp/strcasecmp | 忽略大小寫比較 | 非標準但廣泛支援 | |
| 查找 | strchr | 正向找字元 | 含終結符 |
strrchr | 反向找字元 | ||
strstr | 找子字串 | ||
strpbrk | 找字元集合中任一字元 | ||
| 長度/轉換 | strlen | 字串長度 | 不含 \0 |
atoi/atol/atof | 字串→數值 | 無錯誤回報 | |
strtol/strtod | 字串→數值(健全) | 支援進制、尾端指標回傳 |
<string.h>)memcpy:非重疊複製,速度最快。memmove:正確處理重疊區塊(內部可能反向複製)。memset:批量填充單一位元組值(常用於結構體清零)。memcmp/memicmp:二進位區塊比較,後者忽略大小寫。memchr:區塊內找字元。<ctype.h>)所有函數接受 int(實為 unsigned char 或 EOF),回傳非零表真。常用:isalpha、isdigit、isspace、isalnum、isprint、isxdigit。
| 風險函數 | 問題 | 建議替代 |
|---|---|---|
strcpy/strcat | 緩衝區溢位 | strncpy/strncat、snprintf、strlcpy/strlcat(BSD) |
sprintf | 格式化溢位 | snprintf |
gets | 極度危險 | fgets |
strtok | 非執行緒安全、修改原字串 | strtok_r、strsep、C++ stringstream |
std::string 進階核心筆記front()/back(),用 operator[0]、operator[size()-1]。RandomAccessIterator,支援算術運算。預設、複製、移動、string_view、C 字串(含長度)、n*char、迭代器區間、配置器版本等。
npossize_type 為 size_t(無號),npos = static_cast(-1) 。at() 會拋 out_of_range。compare(s2) // 整體比較
compare(pos, len, s2) // 子串比較
compare(pos, len, s2, pos2, len2) // 雙向子串比較
compare(pos, len, cstr) // 與 C 字串比較
compare(pos, len, cstr, len2) // 與 C 字串片段比較
回傳 -1/0/1 對應 </=/>。
append/insert/replace/erase 多載全覽append 6 種多載:字串、子串、C 字串、片段、填充、迭代器區間。insert 9 種:位置+字串/子串/C字串/填充/迭代器版本。replace 10 種:位置/迭代器區間 × 來源類型。erase 3 種:位置+長度、單一迭代器、迭代器區間。find/rfind/find_first_of/find_last_of/find_first_not_of/find_last_not_of皆回傳 size_type,失敗回 npos。
substr(pos, len) → 新 string。c_str() → const char*(保證以 \0 結尾)。data() → const char*(C++11 起同 c_str())。copy(ptr, len, pos) → 複製到使用者緩衝區(不加 \0)。vector)size()/length()、capacity()、reserve()、resize()、shrink_to_fit() (C++11)。max_size() 受配置器限制。istream_iterator 預設建構為「結尾迭代器」,持有空指標。operator== 比較持有的串流指標。串流轉 bool 依賴 operator void* 或 operator!,讀取失敗時轉為 nullptr/true。
C 風格字串函數雖古老但無處不在,掌握其邊界條件(尤其是 strncpy 不自動補 \0)是避免安全漏洞關鍵。C++ std::string 提供豐富且一致的介面,善用 string_view (C++17) 可進一步避免不必要複製。選對工具、守住邊界,字串處理才能又快又穩。