strcpy 兩種寫法// 版本一:for 迴圈
void my_strcpy1(char *dst, const char *src) {
for (; *src; ++src, ++dst) *dst = *src;
*dst = '\0';
}
// 版本二:while 精簡版 (K&R 風格)
void my_strcpy2(char *dst, const char *src) {
while (*dst++ = *src++); // 賦值結果為字元值,\0 為 0 結束迴圈
}
memcpy:萬用記憶體複製void *my_memcpy(void *dst, const void *src, size_t n) {
char *d = dst; const char *s = src;
while (n--) *d++ = *s++;
return dst;
}
\0。void* 參數/返回,型別通用。memmove若 src 在 dst 範圍內,正向複製會覆蓋未讀資料。
void *my_memmove(void *dst, const void *src, size_t n) {
char *d = dst; const char *s = src;
if (d < s) { // 目的地在前,正向複製安全
while (n--) *d++ = *s++;
} else if (d > s) { // 目的地在後,需逆向複製
d += n; s += n;
while (n--) *--d = *--s;
}
return dst;
}
strcpy/strncpy (注意 strncpy 不保證結尾 \0)。memcpy。memmove (標準庫保證正確處理)。strcpy_s/memcpy_s 提供邊界檢查。