首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C標準庫 string.h 字串操作函數實現:strcat、strcmp、strcpy、strchr 等

     編輯:關於C語言

strcat:字串連接

char *strcat(char *dest, const char *src) {
    char *ret = dest;
    while (*dest) dest++;      // 找到 dest 結尾
    while ((*dest++ = *src++)); // 複製 src 含結尾 \0
    return ret;
}

strncat:限制長度連接

char *strncat(char *dest, const char *src, size_t n) {
    char *ret = dest;
    while (*dest) dest++;
    while (n-- && (*dest++ = *src++));
    *dest = '\0';  // 確保結尾
    return ret;
}

strchr:尋找字元首次出現

char *strchr(const char *s, int c) {
    while (*s && *s != (char)c) s++;
    return (*s == (char)c) ? (char *)s : NULL;
}

strcmp:字串比較

int strcmp(const char *s1, const char *s2) {
    while (*s1 && *s1 == *s2) { s1++; s2++; }
    return *(unsigned char *)s1 - *(unsigned char *)s2;
}

關鍵:用 unsigned char 避免有號字元比較錯誤。回傳值非限定 ±1,僅正/負/零有意義。

strcpy / strncpy:字串複製

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 / strspn / strpbrk:字元集合操作

  • strcspn(s, reject):s 開頭不含 reject 任何字元的長度
  • strspn(s, accept):s 開頭全屬於 accept 的長度
  • strpbrk(s, accept):s 中首個屬於 accept 的字元位址

MSVC 實現採用查找表(位元組映射表)優化:建立 256 位對應表,O(1) 查詢字元是否在集合中,避免雙層迴圈 O(n*m)。

strrchr:尋找字元最後出現

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;
}

strtok:字串分割(非執行緒安全)

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)。

strcoll / strxfrm:地區設定相關比較與轉換

  • 依 LC_COLLATE 當前地區設定比較/轉換
  • 內部呼叫 strcoll_l/strxfrm_l 帶入 locale 參數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved