이 함수들은 예전에 형변환을 잘못해서 귀찮았던 적이 있었던 것 같다.
구현하기 쉽고 다들 비슷한 형태이다.
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);
}
'42 SEOUL > Libft' 카테고리의 다른 글
42 서울 Libft(ft_strchr, ft_strdup, ft_strjoin, ft_strlcat, ft_strlcpy) (1) | 2021.01.25 |
---|---|
42 서울 Libft(ft_putchar_fd, ft_putstr_fd, ft_putendl_fd, ft_putnbr_fd) (0) | 2021.01.25 |
42 서울 Libft(ft_split) (0) | 2020.12.19 |
42 서울 Libft(ft_atoi, ft_itoa) (0) | 2020.12.19 |
42 서울 Libft(ft_isalpha, ft_isdigit, ft_isalnum, ft_isascii, ft_isprint) (0) | 2020.12.19 |