42Seoul/Libft

[C] 나만의 라이브러리 - memset, bzero, memcpy, memccpy, memmove, memchr, memcmp

  • -
728x90

1. memset

void *my_memset(void *s, int c, size_t n);

s위치부터 n바이트 만큼 c값으로 초기화하는 함수

void    *my_memset(void *s, int c, size_t n)
{
    unsigned    char    *ptr;

    ptr = s;
    while (n--)
        *ptr++ = (unsigned char)c;
    return (s);
}
  • 메모리의 1바이트씩 체크와 역참조가 불가능한 void 포인터를 unsigned char포인터로 형변환
  • s의 시작점을 ptr받고 n개 만큼 반복하며 값을 넣어줌

2. bzero

void my_bzero(void *s, size_t n);

s위치부터 n바이트 만큼 0으로 초기화하는 함수

void    my_bzero(void *s, size_t n)
{
    my_memset(s, 0, n);
}

memset을 활용

3. memcpy

void *my_memcpy(void *dst, const void *src, size_t n);

dstsrc의 값들을 n만큼 복사하는 함수

void    *my_memcpy(void *dst, const void *src, size_t n)
{
    size_t    i;

    if (dst == NULL && src == NULL)
        return (dst);
    i = 0;
    while (i < n)
    {
        ((unsigned char *)dst)[i] = ((unsigned char *)src)[i];
        i++;
    }
    return (dst);
}
  • 이 함수는 src 의 널 종료 문자(null terminating character) 을 검사하지 않는다. 언제나 정확히 n 바이트 만큼을 복사
  • 만일 두 메모리 블록이 겹쳐져 있다면 memmove 함수를 이용해야 한다. src의 원본 값이 이전 src로 바뀐 상태에서 복사를 해버리기 때문

4. memccpy

void *my_memccpy(void *dst, const void *src, int c, size_t n);

dstsrc의 값들을 n만큼 복사하는 함수, 복사하는 과정에서 c를 찾게되면 c까지만 복사하고 중단

void    *my_memccpy(void *dst, const void *src, int c, size_t n)
{
    size_t    i;
    int        flag;

    i = 0;
    flag = 0;
    while (i < n && ((unsigned char *)src)[i] && !flag)
    {
        flag = ((unsigned char *)src)[i] == ((unsigned char)c) ? 1 : 0;
        i++;
    }
    if (flag)
    {
        my_memcpy(dst, src, i);
        return (dst + i);
    }
    else
    {
        my_memcpy(dst, src, n);
        return (0);
    }
}
  • 복제된 dest변수에서 복제가 끝난 다음 번지를 반환.
  • 만약 문자 c를 만나지 않았다면, n바이트를 복제하고 NULL을 반환.

5. memmove

void *my_memmove(void *dst, const void *src, size_t n);

src메모리 영역에서 dst 메모리 영역으로 n 바이트 만큼 복사.

이 때, src 배열은 srcdst의 메모리 영역과 겹치지 않는 메모리 영역부터 먼저 복사.

void    *my_memmove(void *dst, const void *src, size_t n)
{
    unsigned char    *s;
    unsigned char    *d;

    if (dst == src || !n)
        return (dst);
    s = (unsigned char *)src;
    d = (unsigned char *)dst;
    if (dst < src)
    {
        while (n--)
            *d++ = *s++;
    }
    else
    {
        while (n--)
            *(d + n) = *(s + n);
    }
    return (dst);
}
  • 한 배열 안에서 복사를 수행
  • src 시작 주소가 dest 시작 주소보다 앞에 있을 떄, 오버랩의 가능성이 생김
  • 따라서 뒤에서부터 한 바이트 씩 복사

6. memchr

void *my_memchr(const void *s, int c, size_t n);

특정 문자를 찾아 그 문자의 주소를 반환하는 함수

void    *my_memchr(const void *s, int c, size_t n)
{
    unsigned    char    *ptr;

    ptr = (unsigned char *)s;
    while (n--)
    {
        if (*ptr != ((unsigned char)c))
            ptr++;
        else
            return (ptr);
    }
    return (0);
}

7. memcpm

int my_memcmp(const void *s1, const void *s2, size_t n);

s1 이 가리키는 처음 n 바이트의 데이터와 s2 가 가리키는 처음 n 바이트의 데이터를 비교하는 함수

int    my_memcmp(const void *s1, const void *s2, size_t n)
{
    const unsigned char *ptr1;
    const unsigned char *ptr2;

    if (!n)
        return (0);
    ptr1 = (unsigned char*)s1;
    ptr2 = (unsigned char*)s2;
    while (n--)
    {
        if (*ptr1 != *ptr2)
            return (*ptr1 - *ptr2);
        ptr1++;
        ptr2++;
    }
    return (0);
}
  • 비교대상의 차이를 반환
728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.