主要な文字列・メモリ関数の実装
C言語標準ライブラリの文字列処理およびメモリ操作関数を独自に実装する方法を示します。各関数の仕様に準拠した動作を再現します。
文字列長の取得
size_t custom_strlen(const char* s) {
const char* start = s;
while (*s) s++;
return s - start;
}
文字列コピー
char* custom_strcpy(char* dest, const char* src) {
char* ptr = dest;
while ((*dest++ = *src++));
return ptr;
}
文字列連結
char* custom_strcat(char* dest, const char* src) {
char* ptr = dest;
while (*dest) dest++;
while ((*dest++ = *src++));
return ptr;
}
文字列比較
int custom_strcmp(const char* s1, const char* s2) {
while (*s1 && *s1 == *s2) {
s1++;
s2++;
}
return *(unsigned char*)s1 - *(unsigned char*)s2;
}
固定長文字列操作
char* custom_strncpy(char* dest, const char* src, size_t n) {
char* ptr = dest;
while (n-- && (*dest++ = *src++));
while (n-- > 0) *dest++ = '\0';
return ptr;
}
char* custom_strncat(char* dest, const char* src, size_t n) {
char* ptr = dest;
while (*dest) dest++;
while (n-- && (*dest++ = *src++));
*dest = '\0';
return ptr;
}
int custom_strncmp(const char* s1, const char* s2, size_t n) {
while (n-- && *s1 && *s1 == *s2) {
s1++;
s2++;
}
return n == -1 ? 0 : *(unsigned char*)s1 - *(unsigned char*)s2;
}
部分文字列検索
char* custom_strstr(const char* haystack, const char* needle) {
if (!*needle) return (char*)haystack;
for (; *haystack; haystack++) {
const char* h = haystack;
const char* n = needle;
while (*h && *n && *h == *n) {
h++;
n++;
}
if (!*n) return (char*)haystack;
}
return NULL;
}
メモリ操作
void* custom_memcpy(void* dest, const void* src, size_t n) {
char* d = dest;
const char* s = src;
while (n--) *d++ = *s++;
return dest;
}
void* custom_memmove(void* dest, const void* src, size_t n) {
char* d = dest;
const char* s = src;
if (d < s) {
while (n--) *d++ = *s++;
} else {
d += n;
s += n;
while (n--) *--d = *--s;
}
return dest;
}
int custom_memcmp(const void* s1, const void* s2, size_t n) {
const unsigned char* p1 = s1;
const unsigned char* p2 = s2;
while (n-- && *p1 == *p2) {
p1++;
p2++;
}
return n == -1 ? 0 : *p1 - *p2;
}