方法一:指針迭代 (標準、高效)
#include
size_t my_strlen(const char *s) {
assert(s);
size_t len = 0;
while (*s++) len++;
return len;
}
方法二:遞迴 (教學展示調用棧)
size_t my_strlen_rec(const char *s) {
assert(s);
return *s ? 1 + my_strlen_rec(s+1) : 0;
}
測試
int main() {
const char *str = "abcdef";
printf("%zu\n", my_strlen(str)); // 6
printf("%zu\n", my_strlen_rec(str)); // 6
return 0;
}
遞迴缺點
- 棧深度 = 字串長度,長字串導致**棧溢位**。
- 函數調用開銷大,效能遠低於迭代。
- 僅適合教學理解遞迴結構。
標準庫實現技巧
- 對齊檢查 + 字長 (64bit) 逐塊讀取 + SIMD 指令 (SSE2/AVX2) 並行比較 0 位元組。
- GCC/Clang
__builtin_strlen 直接編譯為優化指令序列。