1. 문자열 길이 계산 (my_strlen)
널 종료 문자('\0')를 제외한 문자열의 유효 길이 반환
#include <assert.h>
size_t my_strlen(const char* str_ptr) {
assert(str_ptr);
const char* ptr = str_ptr;
while (*ptr) ptr++;
return ptr - str_ptr;
}
2. 문자열 복사 (my_strcpy)
소스 문자열 전체를 대상 버퍼에 복사(널 문자 포함)
char* my_strcpy(char* target, const char* source) {
assert(target && source);
char* orig = target;
while ((*target++ = *source++));
return orig;
}
3. 문자열 추가 (my_strcat)
대상 문자열 끝에 소스 문자열 연결
char* my_strcat(char* dest, const char* src) {
assert(dest && src);
char* orig = dest;
while (*dest) dest++;
while ((*dest++ = *src++));
return orig;
}
4. 문자열 비교 (my_strcmp)
두 문자열을 ASCII 값 기준으로 비교
int my_strcmp(const char* s1, const char* s2) {
assert(s1 && s2);
while (*s1 && *s1 == *s2) {
s1++;
s2++;
}
return *(unsigned char*)s1 - *(unsigned char*)s2;
}
5. 제한 길이 문자열 복사 (my_strncpy)
지정된 길이만큼만 복사, 남은 공간은 널 문자로 채움
char* my_strncpy(char* dest, const char* src, size_t n) {
assert(dest && src);
char* start = dest;
for (size_t i = 0; i < n && *src; i++)
*dest++ = *src++;
for (; dest < start + n; *dest++ = '\0');
return start;
}
6. 제한 길이 문자열 추가 (my_strncat)
지정된 길이만큼만 대상 문자열에 추가
char* my_strncat(char* dest, const char* src, size_t n) {
assert(dest && src);
char* start = dest;
while (*dest) dest++;
for (size_t i = 0; i < n && *src; i++)
*dest++ = *src++;
*dest = '\0';
return start;
}
7. 부분 문자열 검색 (my_strstr)
메인 문자열에서 부분 문자열의 첫 발생 위치 탐색
char* my_strstr(const char* main_str, const char* sub_str) {
if (!*sub_str) return (char*)main_str;
for (const char* p = main_str; *p; p++) {
const char* m = p;
const char* s = sub_str;
while (*m && *s && *m == *s) {
m++;
s++;
}
if (!*s) return (char*)p;
}
return NULL;
}
8. 메모리 복사 (my_memcpy)
바이트 단위 메모리 복제(중복 영역 미처리)
void* my_memcpy(void* dest, const void* src, size_t bytes) {
assert(dest && src);
void* orig = dest;
for (size_t i = 0; i < bytes; i++)
*(char*)dest++ = *(char*)src++;
return orig;
}
9. 안전 메모리 복사 (my_memmove)
메모리 중복 영역을 고려한 복사
void* my_memmove(void* dest, const void* src, size_t bytes) {
assert(dest && src);
unsigned char* d = dest;
const unsigned char* s = src;
if (d < s) {
for (size_t i = 0; i < bytes; i++)
d[i] = s[i];
} else {
for (size_t i = bytes; i > 0; i--)
d[i-1] = s[i-1];
}
return dest;
}