企業面試常考手寫 strcpy,能寫出 10 分滿分版本者寥寥無幾。本文收集論壇常見題目,從技術內涵深度剖析,助你建立扎實內功。
// 1. 來源需 11 bytes (含 \0),目的只有 10 bytes → 溢位
void test1() { char string[10]; char* str1 = "0123456789"; strcpy(string, str1); }
// 2. str1 未以 \0 結尾,strcpy 複製長度不定 → 未定義行為
void test2() { char string[10], str1[10]; for(int i=0;i<10;i++) str1[i]='a'; strcpy(string, str1); }
// 3. strlen 不含 \0,判斷應用 < 10 而非 <= 10
void test3(char* str1) { char string[10]; if(strlen(str1) <= 10) strcpy(string, str1); }
GetMemory(char* p) 以值傳遞指標,函式內修改不影響外部,str 仍為 NULL。p[] 的指標,函式返回後記憶體釋放,成懸空指標。malloc 回傳值;Test 也未 free。free(str) 後未置 NULL,產生野指標;同樣缺 malloc 失敗檢查。
// 2 分:最基本實現
void strcpy(char* strDest, char* strSrc) { while((*strDest++ = *strSrc++) != '\0'); }
// 4 分:const 正確性
void strcpy(char* strDest, const char* strSrc) { ... }
// 7 分:斷言防禦
void strcpy(char* strDest, const char* strSrc) {
assert(strDest && strSrc);
while((*strDest++ = *strSrc++) != '\0');
}
// 10 分:鏈式操作支援
char* strcpy(char* strDest, const char* strSrc) {
assert(strDest && strSrc);
char* address = strDest;
while((*strDest++ = *strSrc++) != '\0');
return address;
}
BOOL 用 !var,int 用 var==0,float 用 epsilon 範圍,指標用 var==NULL —— 清晰表達語意。char str[100] 退化為指標,32 位平台 sizeof(str)==4;malloc 回傳指標同理。#define MIN(A,B) ((A) <= (B) ? (A) : (B)) —— 必須雙層括號,否則 MIN(*p++, b) 導致 p 遞增三次 (副作用);切勿在宏尾加分號。#ifndef/__define__ 防重複包含;extern "C" 解決 C/C++ 混合編譯符號名稱修飾不匹配問題。strlen、memcpy/strcpy,避免手寫迴圈。memcpy 整體讀取,體現資料結構組織能力。*this。union { int a; char b; } c; c.a=1; return c.b==1; 判斷 Little-endian。(1L+n)*n/2,拒絕迴圈累加 —— 數學知識是程式優化的捷徑。面試題不僅是關卡,更是檢視與精進基本功的鏡子。