728x90
반응형

이 함수들은 예전에 형변환을 잘못해서 귀찮았던 적이 있었던 것 같다.

구현하기 쉽고 다들 비슷한 형태이다. 

ft_memcpy: 문자열 src를 n만큼 dest에 복사해주는 함수, 마지막에 dest를 반환해준다.

void	*ft_memcpy(void *dest, const void *src, size_t n)
{
	char	*dest2;
	char	*src2;
	size_t	i;

	dest2 = dest;
	src2 = (char *)src;
	i = 0;
	if (dest2 == src2)
		return (dest2);
	while (i < n)
	{
		dest2[i] = src2[i];
		i++;
	}
	return (dest);
}

 

ft_memccpy: 문자열 src를 n만큼 dest에 복사하되 문자 c까지만 복사해주는 함수
dest에서 c문자가 위치한 위치의 다음 주소를 반환해준다.

void	*ft_memccpy(void *dest, const void *src, int c, size_t n)
{
	char			*ptr1;
	unsigned char	*ptr2;
	size_t			i;

	ptr1 = dest;
	ptr2 = (unsigned char *)src;
	i = 0;
	while (i < n)
	{
		ptr1[i] = ptr2[i];
		if (ptr2[i] == (unsigned char)c)
			return (dest + i + 1);
		i++;
	}
	return (NULL);
}

 

ft_memchr: 문자열 s에서 n 크기 안에 문자 c가 있으면 해당 포인터를, 없다면 null을 반환해주는 함수

void	*ft_memchr(const void *s, int c, size_t n)
{
	unsigned char	*s2;
	unsigned char	c2;
	size_t			i;

	s2 = (unsigned char *)s;
	c2 = (unsigned char)c;
	i = 0;
	while (i < n)
	{
		if (s2[i] == c2)
			return ((void *)s2 + i);
		i++;
	}
	return (NULL);
}

 

ft_memcmp: 문자열 s1, s2를 n만큼 비교하는 함수

비교 도중 다르다면 두 개를 뺀 값을 반환, 끝까지 똑같다면 0을 반환해주면 된다.

int		ft_memcmp(const void *s1, const void *s2, size_t n)
{
	unsigned char	*s11;
	unsigned char	*s22;
	size_t			i;

	s11 = (unsigned char *)s1;
	s22 = (unsigned char *)s2;
	i = 0;
	while (i < n && s11[i] == s22[i])
    {
		if (s11[i] != s22[i])
			return (s11[i] - s22[i]);
        i++;
    }
	return (0);
}

 

ft_memmove: 문자열 src를 n만큼 dest에 옮겨주는 함수

dest의 주소가 src의 주소보다 뒤에 있을 경우에는 주소가 겹칠 수도 있기에 이 경우에는 따로 처리를 해줘야 된다!

dest <= src 라면 그냥 0부터 n까지 (앞에부터) 옮겨주고, dest > src의 경우에는 n부터 0까지(뒤에서부터) 옮겨주면 된다.

EX) dest > src의 경우를 따로 처리하지 않았을 때 -> 앞에서 부터 처리하므로 겹쳐서 꼬일 수도 있음

s = "01234";

dest = s + 2; src = s + 1; n = 2; 라고 치면 처음엔 dest = "134", src = "1134", s = "01134"가 되고

그 다음번엔 dest = "114", src = "1114", s = "01114"가 되어 정말 꼬이게 된다.

EX) dest > src의 경우를 따로 처리했을 때 -> 뒤에서 부터 처리하므로 겹칠수가 없다.

처음엔 dest = "224", src = "1224", s = "01224"가 되고

그 다음번엔 dest = "124", src = "1124", s = "01124"가 된다.

void	*ft_memmove(void *dest, const void *src, size_t n)
{
	char	*dest2;
	char	*src2;
	size_t	i;

	dest2 = (char *)dest;
	src2 = (char *)src;
	i = -1;
	if (!dest && !src)
		return (NULL);
	if (dest2 > src2)
		while ((int)(--n) >= 0)
			dest2[n] = src2[n];
	else
		while (++i < n)
			dest2[i] = src2[i];
	return (dest);
}

 

728x90
반응형

+ Recent posts