안녕하세요! 두번째는 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

+ Recent posts