C 언어 문자열 및 메모리 조작 함수 직접 구현

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;
}

태그: C언어 문자열처리 메모리관리 라이브러리구현 포인터연산

6월 24일 22:54에 게시됨