42서울의 과제 중 내가 틀렸던 문제들에 대한 정리를 해보려고 한다.
이번 과제에서는 각각의 C언어 내장 함수를 구현하는거였는데 각각의 예외처리를
생각해서 작성하는게 핵심이었던거 같다
일단 mem이 앞에 있으면 인자가 정해져 있지 않은 형태이다!
그래서 인자로 void 포인터 형태로 되어있다.
#include <stdlib.h>
void *ft_memcpy(void *dst, const void *src, size_t n)
{
void *ret;
ret = dst;
if (!src & !dst)
return (0);
while (n--)
{
*(char) *dst++ = *(char *)src++;
}
return (ret);
}
memcpy는 따로 메모리 위치에 대한 예외처리를 하지 않았다
그래서 덮어쓰기가 될 수도 있었지만 memmove는 다르다!!!
버퍼에 복사한 후 해당 위치에 가서 버퍼에 복사된 것을 붙여넣는 식!
여기서는 따로 버퍼를 만들지 않고 메모리 위치가 dst가 더 뒤에 있을 경우
n부터 0까지 단어를 채웠다!
여기서도 dst, src 둘 다 널이면 널을 반환!
#include <stdlib.h>
void *memmove(void *dst, const void *src, size_t len)
{
char *ret;
char *src_p;
if (!dst && !src)
return (0);
if (dst <= src)
{
ret = (char *)dst;
src_p = (char *)src;
while (len--)
*ret++ = *src_p++;
}
else
{
ret = (char *)dst;
src_p = (char *)src;
ret += len;
src_p += len;
while (len--)
{
*ret-- = *src_p--;
}
}
return (dst);
}
이 함수는 구현 자체는 좀 쉬운 편인데 테스트케이스에서 실패를 했다..
만약 단어 c가 있으면 먼저 나온 위치를 반환해주기!
char *ft_strchr(const char *s, int c)
{
while (*s != (unsigned char)c)
{
if (*s == '\0')
return (0);
s++;
}
return (char *)s;
}
해석
1. 같은 값이 나오면 널이 나오기 -> 이걸 맨끝까지 돌리면서 가장 뒤에있는 c위치를 찾는다!
2. c가 널이면 이 문자열의 마지막인 널 위치를 반환!
char *ft_strrchr(const char *s, int c)
{
char *ret;
ret = 0;
while (*s)
{
if (*s == (unsigned char)c)
ret = (char *)s;
s++;
}
if (c == 0)
ret = (char *)s;
return (ret);
}
split까지만 하면 다 끝내는 거여서 내일은 split과 makefile, libft.h파일을 정리해보려고 한다!
꼭 이번주는 libft.h를 통과하자!