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

C 語言手寫 strlen 三種實現:計數器、遞歸、雙指針差值

     編輯:關於C語言

C 語言手寫 strlen 三種實現:計數器、遞歸、雙指針差值

strlen 計算字符串長度(不含結束符 \0)。本文展示三種經典實現,分析優劣與適用場景。

一、 方法一:計數器迴圈(最直觀、標準庫常用)

size_t my_strlen_count(const char *str) {
    size_t len = 0;
    while (str[len] != '\0') len++;
    return len;
}
  • 優點:簡單、無副作用、編譯器易優化(向量化)。
  • 缺點:需索引運算,指針版本稍快。

二、 方法二:遞歸(教學展示棧帧,不可用於長字符串)

size_t my_strlen_recursive(const char *str) {
    if (*str == '\0') return 0;
    return 1 + my_strlen_recursive(str + 1);
}
  • 優點:代碼極短、展示遞歸思維。
  • 缺點:棧溢出風險(長字符串)、函數呼叫開銷大、尾遞歸優化不保證。

三、 方法三:雙指針差值(標準庫高優化版本常用)

size_t my_strlen_ptr_diff(const char *str) {
    const char *start = str;
    while (*str) str++;
    return str - start; // 指針減法得元素數
}
  • 優點:無索引運算、純指針運算、現代 CPU 指針運算極快、易於向量化(SSE/AVX 掃描 16/32 字節)。
  • 缺點:需保存起始指針。

四、 性能對比

實現時間複雜度空間複雜度實際速度推薦場景
計數器O(N)O(1)快通用、教學
遞歸O(N)O(N) 棧極慢僅教學演示
指針差值O(N)O(1)最快標準庫、高性能

五、 測試主程式

int main() {
    const char *s = "asdfg";
    printf("count: %zu\n", my_strlen_count(s));
    printf("recursive: %zu\n", my_strlen_recursive(s));
    printf("ptr_diff: %zu\n", my_strlen_ptr_diff(s));
    return 0;
}
// 全輸出 5

六、 總結

工程實踐:優先用指針差值法(或直接呼叫標準庫 strlen)。遞歸版僅適合教學理解棧帧,嚴禁用於生產代碼。

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