안녕하세요! 두번째는 mem시리즈입니다.
💡 memset 함수
✅ memset 함수는 메모리의 내용을 원하는 크기만큼 특정한 값으로 채우는 것으로, 가리키는 메모리 주소부터 n바이트 만큼 c값으로 채워줍니다.
✅ 함수의 원형은 void *memset(void *b, int c, size_t len);입니다.
❗ 성공시 첫번째 인자로 들어간 string을 반환, 실패시 NULL을 반환한다.
✔ memset 구현
#include "libft.h"
void *ft_memset(void *b, int c, size_t len)
{
unsigned char *ch;
int i;
ch = (unsigned char *)b;
i = 0;
while (len)
{
ch[i++] = c;
len--;
}
return (b);
}
💡 memove 함수
✅ memove 함수는 메모리의 내용을 n 사이즈만큼 dest의 메모리에 옮기는 함수입니다.
✅ 함수의 원형은 void *memmove(void *dest, const void *src, size_t n);입니다.
✅ 메모리가 겹쳐도 문제가 생기지 않도록, src의 주소가 dest보다 큰 값인 경우와 아닌 경우로 나눠서 동작합니다.
✅ src의 주소가 더 큰 경우, src를 앞부터 복사하더라도 dest가 항상 큰 위치이기 때문에 문제가 생기지 않습니다.
✅ src의 주소가 더 작은 경우, 앞부터 복사할 경우 src의 data가 바뀐 상태로 dest에 저장될 수 있기 때문에 마지막 데이터부터 한 바이트씩 dest의 마지막 데이터부터 차례대로 넣어줍니다.
❗ dest를 반환한다.
✔ memmove 구현
#include "libft.h"
void *ft_memmove(void *dest, const void *src, size_t n)
{
size_t i;
size_t loc;
if ((dest == NULL && src == NULL) || (n < 0))
return (0);
else if (dest < src)
{
i = -1;
while ((size_t)++i < n)
((unsigned char *)dest)[i] = ((unsigned char *)src)[i];
}
else
{
if (n == 0)
return (dest);
loc = n - 1;
while (loc > 0)
{
((unsigned char *)dest)[loc] = ((unsigned char *)src)[loc];
loc--;
}
((unsigned char *)dest)[0] = ((unsigned char *)src)[0];
}
return (dest);
}
💡 memchr 함수
✅ memchr 함수는 인자로 받아온 메모리 중 n 사이즈 크기에서 원하는 문자를 찾는 함수입니다.
✅ 함수의 원형은 void *ft_memchr(const void *s, int c, size_t n);입니다.
✅ c와 일치하는 값이 있다면 그 곳의 주소를 return, 만약 값을 찾지 못한다면 NULL을 리턴합니다.
✔ memchr 구현
#include "libft.h"
void *ft_memchr(const void *s, int c, size_t n)
{
size_t i;
i = 0;
while (i < n)
{
if (((unsigned char *)s)[i] == (unsigned char)c)
return ((void *)s + i);
i++;
}
return (NULL);
}
💡 memcpy 함수
✅ memcpy 함수는 메모리의 일부분을 복사하는 함수로, src의 n바이트만큼을 dst에 복사합니다.
✅ 함수의 원형은 void *memcpy(void *dst, const void *src, size_t n);입니다.
✅ 전체 복사 시 길이를 계산할 경우 "\0"의 길이도 계산해서 넣어야하기 때문에 1을 더한 길이만큼 해주어야 합니다.
❗ dst를 반환한다.
✔ memcpy 구현
#include "libft.h"
void *ft_memcpy(void *dst, const void *src, size_t n)
{
unsigend char *ch;
unsigned char *sch;
int i;
if (!dst && !src)
return (0);
i = 0;
ch = (unsigned char *)dst;
sch = (unsigned char *)src;
while (n)
{
ch[i] = sch[i];
i++;
n--;
}
return (dst);
}
💡 memcmp 함수
✅ memcmp 함수는 s1과 s2를 n만큼 비교하여 같으면 0, 다르면 그 바이트를 unsigned char로 해석했을 때 s1과 s2의 차이만큼을 반환합니다.
✅ 함수의 원형은 int memcmp(const void *s1, const void *s2, size_t n);입니다.
✔ memcmp 구현
#include "libft.h"
int ft_memcmp(const void *s1, const void *s2, size_t n)
{
size_t i;
i = 0;
while (i < n)
{
if (((unsigned char *)s1)[i] != ((unsigned char *)s2)[i])
return (((unsigned char *)s1)[i] - ((unsigned char *)s2)[i]);
i++;
}
return (0);
}
'42서울' 카테고리의 다른 글
[libft] ft_atoi (0) | 2022.02.18 |
---|---|
[libft] tolower & toupper (0) | 2022.02.17 |
Libft - is시리즈 (1) | 2022.01.05 |
42서울 라피신 후기 (0) | 2022.01.05 |