C 語言字符串操作函數大全:標準庫、內存函數與 C++ string 核心接口
一、C 標準庫字符串函數 (``)
| 函數 | 功能 | 備註 |
| `strcpy(dst, src)` | 複製字符串(含 `\0`) | dst 需足夠大 |
| `strncpy(dst, src, n)` | 複製前 n 字符 | 不足 n 補 `\0` |
| `strcat(dst, src)` | 追加字符串 | 覆蓋 dst 末尾 `\0` |
| `strncat(dst, src, n)` | 追加前 n 字符 | 自動加 `\0` |
| `strlen(s)` | 字符串長度(不含 `\0`) | |
| `strcmp(s1, s2)` | 字典序比較 | 返回 <0,=0,>0 |
| `strncmp(s1, s2, n)` | 比較前 n 字符 | |
| `strchr(s, c)` | 正向查找字符首次出現 | 返回指針/NULL |
| `strrchr(s, c)` | 反向查找字符最後出現 | |
| `strstr(s1, s2)` | 查找子串首次出現 | |
| `strpbrk(s, set)` | 查找 set 中任一字符首次出現 | |
| `strspn(s, set)` | 前綴全屬於 set 的長度 | |
| `strcspn(s, set)` | 前綴全不屬於 set 的長度 | |
| `strtok(s, delim)` | 分割字符串(破壞原串) | 非線程安全 |
| `strdup(s)` | 複製字符串(內部 malloc) | 需手動 free |
| `strrev(s)` | 反轉字符串(非標準) | MSVC 扩展 |
| `strupr/strlwr` | 大小寫轉換(非標準) | |
二、字符串轉數值 (``)
- `atoi/atol/atof` — 簡單轉換,無錯誤檢查
- `strtol/strtod/strtoul` — 完整轉換,支持進制、尾指針返回、錯誤檢查
三、字符分類 (``)
`isalpha/isdigit/isspace/isalnum/isprint/iscntrl/ispunct/isxdigit/isupper/islower` — 參數為 `int`(字符或 EOF),返回非零/零。
四、內存操作函數 (``)
| 函數 | 功能 |
| `memcpy(dst, src, n)` | 複製 n 字節(不處理重疊) |
| `memmove(dst, src, n)` | 複製 n 字節(正確處理重疊) |
| `memset(dst, c, n)` | 設置 n 字節為字符 c |
| `memcmp(s1, s2, n)` | 比較 n 字節 |
| `memchr(s, c, n)` | 查找字符 c 首次出現 |
五、C++ `std::string` 核心接口
`std::string` 非標準容器(無 `front/back`),但提供豐富操作:
構造/賦值
默認、C 串、計數字符、迭代器區間、子串、填充、移動等 13 種重載。
比較
`compare()` 6 種重載:與 string/C串/子串比較,返回 -1/0/1。
附加/插入
`push_back(c)`, `append()` 6 種重載,`insert()` 10 種重載,`operator+=`,`operator+` 5 種重載。
查找/替換/刪除
`find/rfind/find_first_of/find_last_of/find_first_not_of/find_last_not_of` 4 種參數形式。
`replace()` 10 種重載(位置/迭代器、字符串/C串/填充/區間)。
`erase()` 3 種:位置長度、單迭代器、迭代器區間。
子串/複製
`substr(pos, len)` 返回新 string。`copy(ptr, len, pos)` 複製到 C 緩衝區。
`c_str()` 返回 C 串指針,`data()` 同 `c_str()`(C++11 起保證以 `\0` 結尾)。
容量管理
`size/length`, `max_size`, `capacity`, `reserve`, `resize`(可指定填充字符),`shrink_to_fit` (C++11)。
六、輸入迭代器尾端約定
`istream_iterator` 默認構造持有空流指針,`operator==` 比較流指針,以此作為輸入結束哨兵。流讀取失敗時指針置空,配合 `operator bool`/`operator void*` 實現隱式轉換判斷。
七、常見坑點提醒
- 目標緩衝區大小不足導致溢出 — 用 `strncpy`/`snprintf`/`strlcpy`(BSD)防範。
- `strtok` 修改原串且非線程安全 — 多線程用 `strtok_r` 或 C++ `stringstream`/`regex`。
- 字符分類函數參數須轉 `unsigned char` 避免負值未定義行為:`isalpha((unsigned char)ch)`。
- `strcmp` 返回值僅能判斷正負零,不可假設具體值。
- C++ `string` 下標越界不拋異常,返回不可預知值 — 用 `at()` 帶邊界檢查。