理解庫函數內部邏輯、面試手寫、嵌入式裁剪標準庫、教學演示指針操作。
size_t strlen1(const char *s) { // 迭代計數
size_t n = 0;
while (*s++) ++n;
return n;
}
size_t strlen2(const char *s) { // 指針相減
const char *p = s;
while (*p++);
return p - s - 1;
}
size_t strlen3(const char *s) { // 遞歸(教學用,慎用於長串)
return *s ? 1 + strlen3(s+1) : 0;
}
char* strncat_impl(char *dest, const char *src, size_t n) {
char *d = dest;
while (*d) ++d; // 定位 dest 末尾
while (n-- && (*d++ = *src++)); // 複製並檢查 n
*d = '\0';
return dest;
}
char* strcpy_impl(char *dest, const char *src) {
char *d = dest;
while ((*d++ = *src++));
return dest;
}
int strcmp_impl(const char *s1, const char *s2) {
while (*s1 && *s1 == *s2) { ++s1; ++s2; }
return (unsigned char)*s1 - (unsigned char)*s2;
}
char* strstr_impl(const char *hay, const char *needle) {
if (!*needle) return (char*)hay;
for (; *hay; ++hay) {
const char *h = hay, *n = needle;
while (*h && *h == *n) { ++h; ++n; }
if (!*n) return (char*)hay;
}
return NULL;
}
void* memcpy_impl(void *dest, const void *src, size_t n) {
char *d = dest; const char *s = src;
while (n--) *d++ = *s++;
return dest;
}
void* memmove_impl(void *dest, const void *src, size_t n) {
char *d = dest; const char *s = src;
if (d > s && d < s + n) { // 重疊且 dest 在 src 後
d += n; s += n;
while (n--) *--d = *--s;
} else {
while (n--) *d++ = *s++;
}
return dest;
}
dest 支援鏈式調用。strcmp 用 unsigned char 防止負值比較錯誤。memmove 判斷重疊方向決定正向/反向複製。