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

C語言核心庫函數手工實現:字串長度、複製與比較

     編輯:關於C語言

C語言核心庫函數手工實現:字串長度、複製與比較

標準庫<string.h>提供的strlen、strcpy、strcmp是C語言開發中最高頻的字串操作。深入理解其底層實現邏輯,不僅能應對面試考察,更能在嵌入式、底層開發等無標準庫環境下靈活應變。本文提供三種不同風格的手工實現,並解析指標與陣列操作的本質差異。

一、 字串長度計算 strlen

核心邏輯:從首字元遍歷,遇到空字元'\0'停止,計數器即為有效長度。

版本一:陣列下標法(直觀易懂)

int mystrlen1(char s[]) {
    int len = 0;
    while (s[len] != '\0') {
        len++;
    }
    return len;
}

版本二:指標算術法(高效、標準庫常用風格)

int mystrlen2(char *s) {
    int len = 0;
    while (*s != '\0') {
        len++;
        s++; // 指標後移
    }
    return len;
}

測試主程式:

int main() {
    char str[] = "hello";
    printf("版本一長度: %d\n", mystrlen1(str)); // 輸出 5
    printf("版本二長度: %d\n", mystrlen2(str)); // 輸出 5
    return 0;
}

二、 字串複製 strcpy

核心邏輯:將源字串src逐字元複製到目標字串dest,包含結束符'\0'。前提:dest必須有足夠空間。

版本一:陣列下標法

void mystrcpy1(char dest[], char src[]) {
    int i = 0;
    while ((dest[i] = src[i]) != '\0') { // 賦值與判斷合一
        i++;
    }
}

版本二:指標法(顯式指標移動)

void mystrcpy2(char *dest, char *src) {
    while ((*dest = *src) != '\0') {
        dest++;
        src++;
    }
}

版本三:指標精簡法(利用C語言非零即真特性)

void mystrcpy3(char *dest, char *src) {
    while (*dest++ = *src++); // 單分號結束,極度精簡
}

解析: *dest++ = *src++ 先解引用賦值,再將兩指標後移。表達式值為賦值後的字元,遇到'\0'(值為0,假)迴圈結束。

三、 字串比較 strcmp

核心邏輯:逐字元比較兩字串,首個不同字元的ASCII碼差值即為返回值。相等返回0,s1 > s2返回正數,反之負數。

版本一:陣列下標法

int mystrcmp1(char s1[], char s2[]) {
    int i = 0;
    for (; s1[i] == s2[i]; i++) {
        if (s1[i] == '\0') return 0; // 同時到達結尾,相等
    }
    return s1[i] - s2[i]; // 返回差值
}

版本二:指標法

int mystrcmp2(char *s1, char *s2) {
    while (*s1 == *s2) {
        if (*s1 == '\0') return 0;
        s1++;
        s2++;
    }
    return *s1 - *s2;
}

四、 關鍵差異與避坑指南

維度陣列下標法指標法
可讀性高,適合初學者中,需理解指標運算
效能編譯器優化後幾乎一致底層實際機器指令更貼近
參數形式char s[] 實為 char *s直接使用 char *s
常見錯誤越界訪問、忘記處理'\0'指標未復位導致後續邏輯錯誤、修改字串常量崩潰

五、 實戰建議

  1. 嚴禁修改字串常量: char *p = "hello"; p[0] = 'H'; 會導致段錯誤(常量區唯讀)。複製時需確保目標空間可寫(如char dest[100])。
  2. 目標緩衝區大小檢查: 實際專案建議實現strncpy或strlcpy防止緩衝區溢出。
  3. 理解返回值語義: strcmp返回差值而非單純-1/0/1,利用差值可實現字典序排序。

手工實現標準庫函數,是深入C語言「指標與記憶體」本質的最佳路徑。建議讀者對照標準庫源碼(如glibc、musl libc),體會生產級代碼對邊界條件、對齊優化、向量化指令的極致處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved