42서울 - memmove, memcpy, strchr, strrchr 구현

박경현·2023년 10월 18일
0

42서울의 과제 중 내가 틀렸던 문제들에 대한 정리를 해보려고 한다.

이번 과제에서는 각각의 C언어 내장 함수를 구현하는거였는데 각각의 예외처리를
생각해서 작성하는게 핵심이었던거 같다

memcpy

일단 mem이 앞에 있으면 인자가 정해져 있지 않은 형태이다!
그래서 인자로 void 포인터 형태로 되어있다.

memcpy 함수 설명

  1. dst에 src내용을 n바이트 만큼 복사하는걸 말한다!
  2. 따로 메모리 주소에 대한 예외처리가 없는게 특징이다!
  3. dst src 메모리가 겹쳐있어도 그냥 덮어버림!
  4. dst랑 src 둘 다 널이면 n바이트여도 복사를 할 수 없으므로 널을 반환한다!

memcpy 함수 구현

#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);
}

memmove

memmove함수에 대한 설명

memcpy는 따로 메모리 위치에 대한 예외처리를 하지 않았다
그래서 덮어쓰기가 될 수도 있었지만 memmove는 다르다!!!

  1. 버퍼에 복사한 후 해당 위치에 가서 버퍼에 복사된 것을 붙여넣는 식!

    여기서는 따로 버퍼를 만들지 않고 메모리 위치가 dst가 더 뒤에 있을 경우
    n부터 0까지 단어를 채웠다!

  2. 여기서도 dst, src 둘 다 널이면 널을 반환!

memmove함수 구현

#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);
}

strchr

strchr에 대한 설명 & 코드 구현

이 함수는 구현 자체는 좀 쉬운 편인데 테스트케이스에서 실패를 했다..
만약 단어 c가 있으면 먼저 나온 위치를 반환해주기!

char    *ft_strchr(const char *s, int c)
{
	while (*s != (unsigned char)c)
    {
    	if (*s == '\0')
        	return (0);
        s++;
    }
    return (char *)s;
}

strrchr

strrchr 함수 설명 및 구현

해석
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를 통과하자!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글