字符串處理是 C 程式設計的高頻需求。標準庫 <string.h> 提供豐富函數,本文分類整理 27 個常用函數,附帶原型、功能說明與可編譯示例,便於快速查閱。
1. 複製與拼接
| 函數 | 原型 | 說明 | 示例 |
strcpy | char *strcpy(char *dest, const char *src) | 複製字符串含結束符 | strcpy(buf, "hello"); |
strncpy | char *strncpy(char *dest, const char *src, size_t n) | 複製前 n 字符,不足補 \0 | strncpy(buf, src, 5); buf[5]='\0'; |
stpcpy | char *stpcpy(char *dest, const char *src) | 複製並返回 dest 末尾指針 (GNU 擴展) | |
strcat | char *strcat(char *dest, const char *src) | 拼接 src 到 dest 末尾 | strcat(buf, " world"); |
strdup | char *strdup(const char *s) | 分配新記憶體複製字符串,需 free | char *p = strdup(s); |
2. 比較函數
| 函數 | 大小寫敏感 | 比較長度 | 返回值 |
strcmp | 敏感 | 整串 | < 0, =0, >0 |
strncmp | 敏感 | 前 n 字符 | 同上 |
stricmp / strcmpi | 不敏感 | 整串 | 同上 |
strnicmp / strncmpi | 不敏感 | 前 n 字符 | 同上 |
注意:stricmp 等為非標準擴展,跨平台建議自行實現或用 strcasecmp (POSIX)。
3. 查找與掃描
| 函數 | 功能 | 返回值 |
strchr | 查找字符首次出現位置 | 指針或 NULL |
strrchr | 查找字符最後一次出現位置 | 指針或 NULL |
strstr | 查找子串首次出現位置 | 指針或 NULL |
strpbrk | 查找集合中任一字符首次出現 | 指針或 NULL |
strcspn | 計算初始段落不含集合字符的長度 | 長度 (size_t) |
strspn | 計算初始段落僅含集合字符的長度 | 長度 (size_t) |
strtok | 按分隔符分割字符串 (破壞原串、非線程安全) | 下一 token 指針 |
4. 修改與轉換
| 函數 | 功能 |
strset | 將所有字符設為指定值 |
strnset | 前 n 字符設為指定值 |
strrev | 字符串反轉 (Microsoft 擴展) |
strupr / strlwr | 大小寫轉換 (非標準) |
strerror | 根據 errno 返回錯誤描述字符串 |
strtod | 字符串轉 double |
strtol | 字符串轉 long,支援進制 |
swab | 交換相鄰字節 (大小端轉換) |
經典示例:strtok 分割 CSV
char line[] = "apple,banana,orange";
char *token = strtok(line, ",");
while (token) {
puts(token);
token = strtok(NULL, ",");
}
// 輸出: apple / banana / orange (各佔一行)
避坑指南
- 緩衝區溢出:
strcpy/strcat 不檢查長度,優先用 strncpy/strncat 或 snprintf。
strtok 非線程安全、修改原字符串,多線程用 strtok_r (POSIX) 或 C++ stringstream。
- 字符串字面量不可修改:
char *p = "abc"; p[0]='x'; // UB,應用 char p[] = "abc";。
- 大小寫不敏感函數非標準,跨平台項目建議封裝統一介面。