方法一:指針迭代(標準庫風格)
#include <stdio.h>
#include <assert.h>
int my_strlen(const char *str) {
assert(str); // 防禦性編程
int count = 0;
while (*str++) count++; // 移動指針直到 \0
return count;
}
int main() {
char *s = "abcdef";
printf("%d\n", my_strlen(s)); // 6
return 0;
}
方法二:遞歸實現(教學演示)
int my_strlen(const char *str) {
if (*str == '\0') return 0; // 基線條件
return 1 + my_strlen(str + 1); // 遞歸步驟
}
遞歸展開過程 (以 "abc" 為例)
strlen("abc")
= 1 + strlen("bc")
= 1 + (1 + strlen("c"))
= 1 + (1 + (1 + strlen("")))
= 1 + 1 + 1 + 0 = 3
對比與建議
| 維度 | 迭代 | 遞歸 |
| 時間複雜度 | O(n) | O(n) |
| 空間複雜度 | O(1) | O(n) 棧幀 |
| 棧溢出風險 | 無 | 長字符串會溢出 |
| 工程適用性 | 生產環境首選 | 教學/面試展示 |
關鍵點
- 參數用
const char* 防止誤修改;
assert 捕獲空指針;
- 遞歸版需編譯器支持尾調用優化才實用,C 標準不保證。