티스토리 뷰

틀린 내용이나 지식이 있다면 댓글로 알려주세요! 감사합니다!

2021.01.03 내용 수정

2021.01.07 내용 업데이트

 

💡 memchr에 대하여

환경

  • c, c++
  • C에서는 <string.h>
  • C++에서는




Prototype

void    *ft_memchr(const void * ptr, int value, size_t num);
  • ptr : 검색을 수행할 부분의 시작 주소이다.
  • value : 찾을 값으로, int 로 값이 전달되지만 함수 내부적으로는 한 바이트씩 비교하기 때문에 이 값은 unsigned char 로 변환되어 사용된다.
  • num : 검색을 시작한 부분 부터 검색을 수행할 만큼의 바이트 수



 

memchr 목적

  • 메모리 블록에서의 문자를 찾는다.

  • ptr 이 가리키는 메모리의 처음 num 바이트 중에서 처음으로 value 와 일치하는 값의 주소를 리턴한다.

  • 위에 나타난 두 함수의 원형은 C++ 에서 정의된 방식으로 경우에 따라 오버로딩 되어서 나타난다. C 에서는 함수 오버로딩이 없기 때문에 다음과 같이 하나의 원형만을 가진다.



 

Return Value

  • 메모리 블록에서 value 와 일치하는 값이 있다면 그 곳의 주소를 리턴하고 값을 찾지 못한다면 NULL 을 리턴한다.




memchr 함수의 구현

#include <string.h> //NULL과 size_t를 쓰기 위한 헤더
void    *ft_memchr(const void *ptr, int value, size_t num)
{
    size_t    i;

    i = 0;
    while (i < num)
    {
        if (((unsigned char *)ptr)[i] == (unsigned char)value)
            return ((void *)ptr + i);
        i++;
    }
    return ((void *)0);
}

Remind

  • 이 함수를 작성하면서 헷갈렸던 점은 void형 포인터 반환일때 &buffer[10] 작성이 불허하다는 것이였다.
    그 이유는 &buffer[10]가 &(buffer + 10)를 평가하기 때문입니다. 왜냐하면 배열 첨자 연산자는 연산자 &의 주소보다 우선 순위가 높기 때문이다. 그러나 버퍼 유형이 void *이며 크기 정보가 없기 때문에 void 포인터에서는 포인터 계산을 수행할 수 없습니다. 버퍼에 타입캐스트 연산자(char *)를 사용하면 다음과 같이 필요한 크기 정보가 제공됩니다.
    (char *)buffer + 10은 (char)의 버퍼 + 10 * 크기 또는 가변 버퍼가 가리키는 버퍼의 11번째 요소의 주소와 동일합니다.
    즉, 정리하자면 &buffer[10] 대신에 (char *)buffer + 10 로 작성을 해야한다.

  • 사이트의 내용을 참조



 




 

💡 memcmp에 대하여

환경

  • c, c++

  • c에서는 <string.h>

  • c++에서는




Prototype

int    *memcmp(const void *dest, const void *src,size_t num);
  • ptr1 : 비교할 문자열 1
  • ptr2 : 비교할 문자열 2
  • num : num만큼의 복사를 한다.



 

memcmp 목적

  • 두 개의 메모리 블록을 비교한다.
  • ptr1 이 가리키는 처음 num 바이트의 데이터와 ptr2 가 가리키는 처음 num 바이트의 데이터를 비교하여 이들이 같다면 0 을 리턴하고 다르다면 0 이 아닌 값을 리턴한다. 이 때 리턴되는 값은 아래를 참고.

 



 

Return Value

  • 두 개의 메모리 블록의 관계에 따라 아래와 같이 정수 값을 리턴한다.
  • 만일 두 메모리 블록이 정확히 같다면 0 을 리턴한다.
  • 만일 두 메모리 블록이 다를 경우, ptr1ptr2 가 가리키는 메모리 블록에서 앞에서 부터 처음으로 다른 바이트를 살펴 보는데, 그 바이트를 unsigned char 로 해석하였을 때, 그 값이 ptr1 이 더 크면 0 보다 큰 값을, 아니면 0 보다 작은 값을 리턴한다.
  • abcdeadecd 를 입력하였을 때, abcdeadecd 보다 작게 나온다. 이는 memcmp 가 앞에서 부터 처음으로 다른 바이트 (abcde 의 경우 두 번째인 'b', adecd 에서는 두 번째인 'd' ) 를 비교하는데 'b' 가 'd' 보다 아스키 코드 값이 작으므로 0 보다 작은 값이 리턴된다.




memcmp 함수의 구현

#include <string.h> //NULL과 size_t를 쓰기 위한 헤더
int        ft_memcmp(const void *ptr1, const void *ptr2, size_t num)
{
    size_t            i;
    unsigned char    *temp1;
    unsigned char    *temp2;

    i = 0;
    temp1 = (unsigned char *)ptr1;
    temp2 = (unsigned char *)ptr2;
    while (i < num)
    {
        if (temp1[i] != temp2[i])
            return (temp1[i] - temp2[i]);
        i++;
    }
    return (0);
}



 

📕 reference :

 

모두의 코드 78

모두의 코드 84

모두의 코드 92

일상메모장

728x90
반응형