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

C 標準庫字符串函數手工實現:strlen/strcpy/strcat/strcmp/strstr/memcpy/memmove

     編輯:關於C

實現目的

理解庫函數內部邏輯、面試手寫、嵌入式裁剪標準庫、教學演示指針操作。

核心函數實現

strlen - 三種風格


size_t strlen1(const char *s) {  // 迭代計數
    size_t n = 0;
    while (*s++) ++n;
    return n;
}
size_t strlen2(const char *s) {  // 指針相減
    const char *p = s;
    while (*p++);
    return p - s - 1;
}
size_t strlen3(const char *s) {  // 遞歸(教學用,慎用於長串)
    return *s ? 1 + strlen3(s+1) : 0;
}

strncat - 追加 n 字符


char* strncat_impl(char *dest, const char *src, size_t n) {
    char *d = dest;
    while (*d) ++d;          // 定位 dest 末尾
    while (n-- && (*d++ = *src++)); // 複製並檢查 n
    *d = '\0';
    return dest;
}

strcpy - 返回 dest


char* strcpy_impl(char *dest, const char *src) {
    char *d = dest;
    while ((*d++ = *src++));
    return dest;
}

strcmp - 字典序比較


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

strstr - 子串查找(暴力匹配)


char* strstr_impl(const char *hay, const char *needle) {
    if (!*needle) return (char*)hay;
    for (; *hay; ++hay) {
        const char *h = hay, *n = needle;
        while (*h && *h == *n) { ++h; ++n; }
        if (!*n) return (char*)hay;
    }
    return NULL;
}

memcpy - 不處理重疊


void* memcpy_impl(void *dest, const void *src, size_t n) {
    char *d = dest; const char *s = src;
    while (n--) *d++ = *s++;
    return dest;
}

memmove - 處理重疊(反向複製)


void* memmove_impl(void *dest, const void *src, size_t n) {
    char *d = dest; const char *s = src;
    if (d > s && d < s + n) {  // 重疊且 dest 在 src 後
        d += n; s += n;
        while (n--) *--d = *--s;
    } else {
        while (n--) *d++ = *s++;
    }
    return dest;
}

關鍵點提醒

  • 返回 dest 支援鏈式調用。
  • strcmp 用 unsigned char 防止負值比較錯誤。
  • memmove 判斷重疊方向決定正向/反向複製。
  • 標準庫實現通常用汇編優化(向量化、字對齊),手寫版僅供理解語義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved