常用函數速查表
| 函數 | 原型 | 功能 | 回傳 |
| strlen | size_t strlen(const char *s) | 計算字串長度 (不含 \0) | 長度 |
| strcpy | char *strcpy(char *dst, const char *src) | 複製字串至 dst (需保證空間足夠) | dst |
| strcmp | int strcmp(const char *s1, const char *s2) | 按 ASCII 碼逐字元比較 | <0 / 0 / >0 |
| strchr | char *strchr(const char *s, int c) | 尋找字元 c 首次出現位址 | 位址 / NULL |
| strstr | char *strstr(const char *hay, const char *needle) | 尋找子字串首次出現位址 | 位址 / NULL |
| strcat | char *strcat(char *dst, const char *src) | 將 src 接到 dst 尾部 (需空間足夠) | dst |
綜合範例:姓名格式轉換 "jie wang" → "wang, jie"
#include <stdio.h>
#include <string.h>
void reverseName(const char *name, char *out) {
char *space = strchr(name, ' '); // 定位空格
if (!space) { strcpy(out, name); return; }
*space = '\0'; // 暫時截斷
strcpy(out, space + 1); // 複製姓氏
strcat(out, ", "); // 加逗號空格
strcat(out, name); // 接名字
*space = ' '; // 還原 (若原字串可修改)
}
int main() {
char name[] = "jie wang"; // 可修改陣列
char newName[30];
reverseName(name, newName);
printf("%s\n", newName); // 輸出: wang, jie
return 0;
}
關鍵細節提醒
- 緩衝區安全:
strcpy/strcat 不檢查目的緩衝區大小,實務建議改用 strncpy/strncat 或 snprintf。
- 字串字面常數不可修改:
char *p = "abc"; p[0]='x'; 會導致段錯誤。需用陣列 char p[] = "abc";。
- strcmp 回傳值語意:
s1 < s2 → 負值,== → 0,> → 正值,切勿寫成 if (strcmp(a,b)) 判斷相等(應寫 == 0)。
- strchr/strstr 回傳指標:指向原字串內部,可直接列印子字串或計算偏移
ptr - base 得索引。
- 多位元組字元集 (UTF-8) 下:上述函數按**位元組**操作,非字元;中文處理請用
wchar.h 或 ICU 庫。
進階替代方案
| 需求 | 推薦函數/庫 |
| 安全複製/拼接 | strlcpy/strlcat (BSD)、snprintf |
| 不區分大小寫比較 | strcasecmp / _stricmp |
| Token 切割 | strtok_r (可重入)、strsep |
| Unicode 正規化/比較 | ICU (icu4c)、wcs* 寬字元函數族 |
結語
熟練掌握 string.h 六大核心函數,配合指標算術與緩衝區管理,即可處理 90% 的 C 語言字串任務。記住:**安全第一、邊界檢查、編碼意識**,是從「能跑」到「健壯」的關鍵。