char *strcat(char *dest, const char *src) {
char *ret = dest;
while (*dest) dest++; // 找到 dest 結尾
while ((*dest++ = *src++)); // 複製 src 含結尾 \0
return ret;
}
char *strncat(char *dest, const char *src, size_t n) {
char *ret = dest;
while (*dest) dest++;
while (n-- && (*dest++ = *src++));
*dest = '\0'; // 確保結尾
return ret;
}
char *strchr(const char *s, int c) {
while (*s && *s != (char)c) s++;
return (*s == (char)c) ? (char *)s : NULL;
}
int strcmp(const char *s1, const char *s2) {
while (*s1 && *s1 == *s2) { s1++; s2++; }
return *(unsigned char *)s1 - *(unsigned char *)s2;
}
關鍵:用 unsigned char 避免有號字元比較錯誤。回傳值非限定 ±1,僅正/負/零有意義。
char *strcpy(char *dest, const char *src) {
char *ret = dest;
while ((*dest++ = *src++));
return ret;
}
char *strncpy(char *dest, const char *src, size_t n) {
char *ret = dest;
while (n-- && (*dest++ = *src++));
while (n--) *dest++ = '\0'; // 補足 \0
return ret;
}
strcspn(s, reject):s 開頭不含 reject 任何字元的長度strspn(s, accept):s 開頭全屬於 accept 的長度strpbrk(s, accept):s 中首個屬於 accept 的字元位址MSVC 實現採用查找表(位元組映射表)優化:建立 256 位對應表,O(1) 查詢字元是否在集合中,避免雙層迴圈 O(n*m)。
char *strrchr(const char *s, int c) {
const char *last = NULL;
while (*s) {
if (*s == (char)c) last = s;
s++;
}
if (c == '\0') return (char *)s; // 尋找結尾
return (char *)last;
}
char *strtok(char *s, const char *delim) {
static char *next = NULL;
if (s) next = s;
if (!next) return NULL;
// 跳過前導分隔符
s = next;
while (*s && strchr(delim, *s)) s++;
if (!*s) return next = NULL;
// 找到 token 結尾
char *token = s;
while (*s && !strchr(delim, *s)) s++;
if (*s) *s++ = '\0';
next = s;
return token;
}
使用 static 變數保存狀態,非執行緒安全,多次呼叫會互相干擾。現代建議用 strtok_r (POSIX) 或 strtok_s (C11)。
LC_COLLATE 當前地區設定比較/轉換strcoll_l/strxfrm_l 帶入 locale 參數