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

C語言字串複製面試題:strcpy 手寫與緩衝區陷阱

     編輯:關於C語言

標準實現

char *strcpy(char *dest, const char *src) {
    char *ret = dest;
    while ((*dest++ = *src++) != '\0');
    return ret;
}

關鍵點

  • 賦值表達式值即為賦值結果,\0 為 0 結束循環。
  • 複製包含結束符,目的緩衝區必須足夠大(呼叫端責任)。
  • 回傳原始 dest 支援鏈式:strcpy(buf, strcpy(buf2, src))。

常見錯誤

  1. 緩衝區溢位:char buf[10]; strcpy(buf, "too long string"); → 未定義行為。
  2. 重疊複製:strcpy(buf+2, buf); → 行為未定義(需用 memmove)。
  3. 忽略 const:參數應為 const char*,防止誤修改來源。

安全替代

// strncpy:不保證以 \0 結尾,需手動補齊
strncpy(dest, src, n-1); dest[n-1] = '\0';

// strlcpy (BSD/Linux):保證 \0 結尾,回傳來源長度
size_t strlcpy(char *dst, const char *src, size_t size);

// strcpy_s (C11 Annex K):強制檢查緩衝區大小
errno_t strcpy_s(char *dest, size_t destsz, const char *src);

原始碼片段分析

文章僅給出極簡片段:

cpystr( * source, *(*target++ = *source++ 
strlen( * size = (*str++ != ++ 
main(* s = c[strlen(s)] * p =

片段不完整,且 c[strlen(s)] 缺少 +1 空間給結束符,存在溢位隱患。

面試回答策略

  1. 先寫標準版 strcpy,解釋循環條件與回傳值。
  2. 主動指出:不檢查緩衝區大小、不處理重疊、不支援 Unicode (需 wcscpy)。
  3. 補充安全版 strlcpy 或 strcpy_s 用法。
  4. 延伸討論:strlen 實現、strcmp、strcat 同樣存在緩衝區風險。

手寫 strcpy 是 C 指標功力的入門考題,能否寫出正確、安全、符合標準庫行為的版本,直接反映工程基礎扎實度。

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