標準 strcpy 行為
- 將
src 指向的字串(含結尾 \0)複製到 dest。
- 回傳
dest 原始值,支援鏈式呼叫:strlen(strcpy(buf, "abc"))。
完整實作
#include
#include
#include
char* my_strcpy(char *dest, const char *src) {
char *ret = dest; // 保存起始位址以便回傳
assert(src != NULL);
assert(dest != NULL);
while (*dest++ = *src++) { // 複製字元並檢測 '\0'
; // 空敘述
}
return ret;
}
int main() {
char *p = "bit-tech";
char arr[20];
char *ret1 = my_strcpy(arr, p);
printf("%s\n", ret1); // 輸出 bit-tech
return 0;
}
關鍵細節解析
const char *src:承諾不修改來源字串。
assert:防禦性程式設計,捕捉空指標。
while (*dest++ = *src++):
① 取 *src 值賦給 *dest。
② 兩指標各自後移。
③ 以賦值結果(字元值)作為條件,遇 \0(值 0)為假,迴圈結束,\0 已被複製到 dest。
④ 整條敘述無需大括號,慣用 ; 空敘述。
- 回傳
ret 而非 dest,因 dest 已指向結尾。
常見錯誤
- 忘記複製
\0 導致目的字串非法。
- 未檢查空間大小,造成緩衝區溢位(標準庫
strcpy 同樣有此問題,實務建議用 strncpy 或 strcpy_s)。