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

C語言面試經典:字串複製與長度計算實現(strcpy/strlen)

     編輯:關於C語言

面試考點

手寫 strcpy 與 strlen,考察指標操作、空字元處理、緩衝區安全意識。

標準實現

// 字串複製:回傳目的地址,支援鏈式呼叫
char *my_strcpy(char *dest, const char *src) {
    char *ret = dest;
    while ((*dest++ = *src++) != '\0');  // 複製包含結束符
    return ret;
}

// 字串長度:不包含結束符
size_t my_strlen(const char *str) {
    size_t len = 0;
    while (*str++) len++;
    return len;
}

關鍵細節

  1. const char *src:承諾不修改來源。
  2. while (*dest++ = *src++):賦值表達式值為賦值結果,遇 \0 為 0 結束循環,且 \0 已寫入目的地。
  3. 回傳 dest 原始值(ret),符合標準庫行為。
  4. strlen 回傳 size_t(無號),避免負長度。

安全版本(面試加分項)

// strncpy 風格:限制最大複製字元數,確保以 \0 結尾
char *my_strncpy(char *dest, const char *src, size_t n) {
    char *ret = dest;
    while (n-- > 0 && (*dest++ = *src++));
    if (n == 0) *dest = '\0';  // 來源過長,手動結尾
    return ret;
}

// 安全長度:限制最大掃描長度,防無結束符字串導致越界
size_t my_strnlen(const char *str, size_t maxlen) {
    size_t len = 0;
    while (len < maxlen && *str++) len++;
    return len;
}

常見錯誤與陷阱

  • 忘記複製 \0 → 目的字串無結尾,後續操作越界。
  • dest 空間不足 → 緩衝區溢位(需呼叫端保證或用 strncpy)。
  • src 與 dest 重疊 → 行為未定義(應用 memmove)。
  • 將 strlen 用於二進位資料 → 遇 \0 截斷,錯誤。

原始碼問題分析

文章提供兩個版本:

  1. 固定 char c[10] → 若來源超過 9 字元溢位。
  2. 改為 char c[strlen(s)] → VLA 長度不含結束符,仍會溢位 1 字元。正確應為 strlen(s)+1。

最佳實踐

  • 生產代碼直接用標準庫 strcpy/strlen(編譯器內建優化)。
  • 需安全時用 strlcpy (BSD) 或 strcpy_s (C11 Annex K)。
  • 面試時先寫標準版,再主動提出安全版與重疊問題,展示工程成熟度。

字串操作是 C 語言指標掌握度的試金石,手寫 strcpy/strlen 能快速檢驗候選人對記憶體模型、空字元約定、緩衝區安全的理解深度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved