標準原型 (C89 起)
#include <string.h>
char *strchr(const char *s, int c);
核心行為
- 在字串
s (含結束符 \0) 中尋找 **首個** 與 (char)c 相等的字符。
- **返回值**:
- 找到 → 指向該字符的指標 (
char *)。
- 未找到 →
NULL。
- 可用於檢測字符是否存在:
if (strchr(s, '.')) 判斷 s 是否含小數點。
常見誤區對照
| 誤區 | 事實 |
「返回 void」 | 返回 char *,調試器若顯示 void 可能為符號表缺失或強制轉型 |
| 「修改原字串」 | **不修改**,const char * 參數保證只讀 |
| 「找子字串」 | 僅找**單字符**,子字串用 strstr |
| 「區分大小寫」 | **嚴格區分**,'A' != 'a' |
配套函數家族
| 函數 | 功能 | 返回 |
strchr | 正向找字符 | 首次位址 / NULL |
strrchr | 反向找字符 (最後一次) | 最後位址 / NULL |
strstr | 找子字串 | 首次位址 / NULL |
strpbrk | 找字符集合中任一字符 | 首次位址 / NULL |
strcspn | 計算不含字符集合的前綴長度 | size_t |
strspn | 計算僅含字符集合的前綴長度 | size_t |
實戰片段
// 1. 去除換行符 (fgets 讀取後常用)
char *nl = strchr(line, '\n');
if (nl) *nl = '\0';
// 2. 解析 "key=value" 格式
char *eq = strchr(buf, '=');
if (eq) {
*eq = '\0';
char *key = buf;
char *val = eq + 1;
// ...
}
// 3. 判斷字串是否為純數字
int is_all_digits(const char *s) {
return strspn(s, "0123456789") == strlen(s);
}
性能提示
- 標準庫實現通常為 **手寫組合語言優化** (SIMD 掃描),極難手寫超越。
- 極短字串 (≤ 16 字節) 簡單循環可能因函數調用開銷較慢,但可忽略。