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; // 指針減法得元素數
}
| 實現 | 時間複雜度 | 空間複雜度 | 實際速度 | 推薦場景 |
|---|---|---|---|---|
| 計數器 | 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)。遞歸版僅適合教學理解棧帧,嚴禁用於生產代碼。