首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

面試必考:手寫 strlen 實現與邊界條件完整測試

     編輯:關於C

核心邏輯

從頭遍歷直到遇到 '\0',計數器即為長度(不含結尾符)。

標準實現

size_t my_strlen(const char *str) {
    if (!str) return 0;          // 防禦性:NULL 視為長度 0
    size_t len = 0;
    while (str[len] != '\0') ++len;
    return len;
}

指標版本(等價)

size_t my_strlen_ptr(const char *str) {
    if (!str) return 0;
    const char *p = str;
    while (*p) ++p;
    return p - str;
}

完整測試用例

int main(void) {
    char s1[] = "hello";        // 5
    char *s2 = "OK";            // 2
    char *s3 = "";              // 0
    char *s4 = NULL;            // 0 (防禦)

    printf("s1: %zu\n", my_strlen(s1));
    printf("s2: %zu\n", my_strlen(s2));
    printf("s3: %zu\n", my_strlen(s3));
    printf("s4: %zu\n", my_strlen(s4));
    return 0;
}

輸出驗證

s1: 5
s2: 2
s3: 0
s4: 0

關鍵區別:strlen vs sizeof

運算式結果說明
strlen("abc")3運行期計數
sizeof("abc")4編譯期常量大小(含 \0)
char a[]="abc"; sizeof(a)4陣列大小
char *p="abc"; sizeof(p)4/8指標大小

面試加分點

  • 說明 size_t 為無號型別,格式化用 %zu (C99)。
  • 討論 NULL 處理策略:返回 0 vs 斷言 vs 崩潰(標準庫行為未定義,防禦性返回 0 較安全)。
  • 提及優化:編譯器可能內建 __builtin_strlen,手寫版本僅供教學。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved