內存操作函數
| 函數 | 原型 | 說明 | 注意事項 |
| memcpy | void *memcpy(void *dest, const void *src, size_t n) | 複製 n 字節 src→dest | 內存區域**不得重疊**,否則行為未定義 |
| memmove | void *memmove(void *dest, const void *src, size_t n) | 複製 n 字節,處理重疊 | 內部用臨時緩衝或反向複製保證正確,稍慢於 memcpy |
| memset | void *memset(void *s, int c, size_t n) | 將 s 前 n 字節置為 c | c 取低 8 位;結構體/陣列清零最快方法 |
| memcmp | int memcmp(const void *s1, const void *s2, size_t n) | 比較前 n 字節 | 返回 <0,=0,>0;不受 \0 影響,純二進制比較 |
字符串複製/連接
| 函數 | 原型 | 說明 | 安全性 |
| strcpy | char *strcpy(char *dest, const char *src) | 複製含 \0 的字符串 | **不安全**:無長度檢查,易緩衝區溢出 |
| strncpy | char *strncpy(char *dest, const char *src, size_t n) | 複製至多 n 字符 | 若 src 長度 < n,補 \0 至 n;否則**不保證**以 \0 結尾 |
| strcat | char *strcat(char *dest, const char *src) | 追加 src 到 dest 末尾 | **不安全**:需確保 dest 空間足夠 |
| strncat | char *strncat(char *dest, const char *src, size_t n) | 追加至多 n 字符 | 保證結果以 \0 結尾;仍需空間檢查 |
字符串比較
| 函數 | 原型 | 說明 | 區別 |
| strcmp | int strcmp(const char *s1, const char *s2) | 字典序比較(ASCII) | 區分大小寫,遇 \0 停止 |
| strncmp | int strncmp(const char *s1, const char *s2, size_t n) | 比較前 n 字符 | 長度限制,適合前綴匹配 |
| strcasecmp | int strcasecmp(const char *s1, const char *s2) | 忽略大小寫比較 | POSIX 擴展,非標準 C |
| strncasecmp | int strncasecmp(const char *s1, const char *s2, size_t n) | 忽略大小寫前 n 字符 | POSIX 擴展 |
查找與長度
| 函數 | 原型 | 說明 | 返回值 |
| strchr | char *strchr(const char *s, int c) | 查找字符 c 首次出現位置 | 指針或 NULL |
| strrchr | char *strrchr(const char *s, int c) | 查找最後一次出現 | 指針或 NULL |
| strstr | char *strstr(const char *haystack, const char *needle) | 查找子串首次出現 | 指針或 NULL |
| strlen | size_t strlen(const char *s) | 計算長度(不含 \0) | size_t 無號 |
安全替代函數(C11 Annex K / Microsoft 安全版)
// 邊界檢查版本,需定義 __STDC_WANT_LIB_EXT1__ 1
errno_t strcpy_s(char *dest, rsize_t destsz, const char *src);
errno_t strcat_s(char *dest, rsize_t destsz, const char *src);
errno_t strncpy_s(char *dest, rsize_t destsz, const char *src, size_t n);
返回 0 成功,非 0 失敗(如緩衝區太小),並保證目標以 \0 結尾。
常見坑點提醒
strncpy 不保證 \0 結尾 → 手動 dest[n-1]='\0'。
strcat 多次追加導致 O(n²) → 用指針記錄末尾或 stpcpy (GNU 擴展)。
strcmp 返回差值非布爾 → 只判斷 ==0 相等,<0 >0 大小。
- 字符串字面量存儲在只讀段 →
char *p="abc"; p[0]='x'; 崩潰,應用 char p[]="abc";。