最佳實踐版本
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
char *my_strcpy(char *dst, const char *src) {
assert(dst != NULL && src != NULL); // 斷言非空
char *ret = dst; // 保存目標起始地址
while ((*dst++ = *src++) != '\0'); // 拷貝含結束符
return ret; // 返回 dst 支援鏈式調用
}
int main() {
char *src = "bit-tech";
char dst[20];
printf("長度: %zu\n", strlen(my_strcpy(dst, src))); // 鏈式調用 strlen
return 0;
}
設計亮點
const char *src:明確輸入參數不可修改。
assert:防禦性編程,捕獲空指針。
- 返回
dst:允許 strlen(strcpy(dst, src)) 等鏈式表達。
- 拷貝循環包含
'\0',保證目標字符串正確結束。
同理可寫 strlen
size_t my_strlen(const char *s) {
assert(s);
const char *p = s;
while (*p) p++;
return p - s;
}