size_t strlen(const char *str) 返回字符串長度(**不包含** 結束符 \0)。未定義行為:str 為空指針或非以 \0 結尾。
int strlen1(const char *str) { const char *s; for (s = str; *s; ++s); return s - str; }
int strlen2(char str[]) { int i; for (i = 0; str[i]; ++i); return i; }
int strlen3(char str[]) { char *s = str; while (*s) ++s; return s - str; }
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; }
| 實現 | 時間復雜度 | 空間復雜度 | 優點 | 缺點 |
|---|---|---|---|---|
| 指針 for | O(n) | O(1) | 緊湊、指針算術本質、編譯器易優化 | 需理解指針減法 |
| 數組下標 | O(n) | O(1) | 直觀、適合初學者 | 隱含指針運算 |
| while 指針 | O(n) | O(1) | 經典 K&R 風格 | 同指針 for |
| 遞歸 | O(n) | O(n) 棧 | 展示遞歸思想 | 長字符串棧溢出、效率低 |
現代 libc(glibc、musl、MSVC)使用向量指令(SSE2/AVX2/NEON)每周期檢查 16/32/64 字節,配合位掩碼快速定位 \0,實現 strlen 數倍加速。手寫版僅供教學,生產代碼**直接調用標準庫**。