在 C 語言的筆試面試中,手寫標準庫函數 strlen 是一道經典的基礎題目。雖然看似簡單,但能否寫出健壯、高效的代碼,往往能體現應聘者對 C 語言字符串結構、指針運算及邊界條件處理的理解深度。本文將從原理分析、代碼實現、測試驗證三個維度,帶你徹底攻克這道必考題。
C 語言中,字符串實際上是一個以空字符 '\0' 結尾的字符數組。strlen 的任務就是計算這個空字符之前的有效字符個數。換句話說,我們只需要從字符串首地址開始遍歷,直到遇到 '\0' 為止,計數器的值即為字符串長度。
#include <stdio.h>
// 自定義 strlen 實現
int MyStrlen(const char *str) {
// 1. 防禦性編程:檢查指針有效性
if (str == NULL) {
return 0;
}
int count = 0;
// 2. 利用後置遞增遍歷,遇到 '\0' 停止
// 注意:這裡故意留空循環體,所有邏輯在條件判斷中完成
while (str[count++] != '\0')
;
// 3. 循環結束時 count 已經多加了一次(指向 '\0' 的下一個位置),需減 1
return count - 1;
}
// 測試主函數
int main() {
char str1[] = "hello"; // 5
char *str2 = "OK"; // 2
char *str3 = ""; // 0
char *str4 = NULL; // 0 (測試空指針保護)
printf("str1 = %s, len = %d\n", str1, MyStrlen(str1));
printf("str2 = %s, len = %d\n", str2, MyStrlen(str2));
printf("str3 = %s, len = %d\n", str3, MyStrlen(str3));
printf("str4 = %s, len = %d\n", str4 ? str4 : "(null)", MyStrlen(str4));
return 0;
}
const char *,表明函數不會修改字符串內容,符合標準庫規範,也防止誤操作。strlen 對空指針行為未定義,但在面試中主動加上 if (str == NULL) return 0; 體現良好的防禦性編程習慣,加分項。while (str[count++] != '\0') 利用後置遞增特性,循環結束時 count 指向結束符下一位,故返回 count - 1。也可用指針算術 while (*str++) 配合兩指針相減實現,效果相同。size_t(無符號長整型),這裡為簡化教學用 int,實際項目中應遵循標準。編譯運行上述代碼,輸出如下:
str1 = hello, len = 5 str2 = OK, len = 2 str3 = , len = 0 str4 = (null), len = 0
所有邊界情況(普通字符串、空字符串、空指針)均通過測試。
size_t strlen(const char *s) { const char *p = s; while (*p); return p - s; } 展示指針運算功底。size_t、參數 const char*、無副作用等標準要求。掌握 strlen 手寫不僅是為了通過面試,更是理解 C 語言「字符串本質是字符數組,以 \0 結尾」這一核心哲學的入門鑰匙。熟練掌握其變體寫法,並能說清每一行代碼的意圖,才是真正過關。