1. strcpy
char *my_strcpy(char *dst, const char *src) {
assert(dst && src);
char *ret = dst;
while ((*dst++ = *src++) != '\0');
return ret; // 支援鏈式調用
}
2. strcat
char *my_strcat(char *dst, const char *src) {
assert(dst && src);
char *ret = dst;
while (*dst) dst++;
while ((*dst++ = *src++) != '\0');
return ret;
}
3. strcmp
int my_strcmp(const char *s1, const char *s2) {
assert(s1 && s2);
while (*s1 && *s1 == *s2) { s1++; s2++; }
return *s1 - *s2;
}
4. memcpy
void *my_memcpy(void *dst, const void *src, size_t n) {
assert(dst && src);
char *d = dst; const char *s = src;
while (n--) *d++ = *s++;
return dst;
}
5. memmove(處理重疊)
void *my_memmove(void *dst, const void *src, size_t n) {
assert(dst && src);
char *d = dst; const char *s = src;
if (d > s && d < s + n) { // 目標在源之後且重疊 → 逆向拷貝
d += n; s += n;
while (n--) *--d = *--s;
} else { // 正向拷貝
while (n--) *d++ = *s++;
}
return dst;
}
測試主程序
int main() {
char a[20], b[] = "hello";
my_strcpy(a, b);
my_strcat(a, " world");
printf("%s\n", a); // hello world
int arr1[5]={1,2,3,4,5}, arr2[5];
my_memcpy(arr2, arr1, 20);
my_memmove(arr1+2, arr1, 12); // 重疊測試
return 0;
}