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

C 庫函數 strlen 多種實現:指針、數組、遞歸

     編輯:關於C語言

標準庫行為

size_t strlen(const char *str) 返回字符串長度(**不包含** 結束符 \0)。未定義行為:str 為空指針或非以 \0 結尾。

四種手寫實現

1. for 循環 + 指針(推薦,標準庫常用)

int strlen1(const char *str) {
    const char *s;
    for (s = str; *s; ++s);
    return s - str;
}

2. for 循環 + 數組下標

int strlen2(char str[]) {
    int i;
    for (i = 0; str[i]; ++i);
    return i;
}

3. while 循環 + 指針

int strlen3(char str[]) {
    char *s = str;
    while (*s) ++s;
    return s - str;
}

4. 遞歸(教學用,棧溢出風險)

int strlen4(char str[]) {
    return *str ? strlen4(str + 1) + 1 : 0;
}

測試主函數

int main() {
    char *s = "hello,world";
    int l = strlen4(s);
    printf("%d\n", l); // 11
    return 0;
}

性能與適用性對比

實現時間復雜度空間復雜度優點缺點
指針 forO(n)O(1)緊湊、指針算術本質、編譯器易優化需理解指針減法
數組下標O(n)O(1)直觀、適合初學者隱含指針運算
while 指針O(n)O(1)經典 K&R 風格同指針 for
遞歸O(n)O(n) 棧展示遞歸思想長字符串棧溢出、效率低

進階:SIMD 優化(標準庫實現)

現代 libc(glibc、musl、MSVC)使用向量指令(SSE2/AVX2/NEON)每周期檢查 16/32/64 字節,配合位掩碼快速定位 \0,實現 strlen 數倍加速。手寫版僅供教學,生產代碼**直接調用標準庫**。

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