ft_memchr 구현
1. ft_memchr 용도
* 이 함수는 매개변수로 const void *ptr, int value, size_t num을 갖는다.
* ptr이 가리키는 메모리의 num byte까지 value가 있는지 없는지 찾는 함수.
* value가 있다면 value와 일치하는 ptr의 값의 주소를 반환.
2. ft_memchr 프로토타입
void *ft_memchr(const void *ptr, int value, size_t num)
char void *ptr : value가 있는지 검색할 문자열
int value : 아스키 코드상의 문자로 ptr에서 검색할 문자
size_t num : ptr에서 얼마나 검색할 것인지 범위를 나타내는 size_t 변수 num
3. 구현 시 유의사항
- value를 만나지 못했을 시에 NULL 반환
<중요>
-
검색할 문자 value는 int로 주어지기 때문에
unsigned char
로 형변환하여 검색한다.
--> char로 형변환하지 않는 이유는, 특정 아키텍쳐 cpu를 사용하는 환경에서는unsigned char
가 디폴트이다.
이러한 환경에서 char을 사용했을 때 unsigned char로 바뀌어 적용된다.
이렇듯 char을 이용했을 때환경마다 다르게 동작
할 수 있기 때문에 관례상 unsigned char을 이용한다. -
ptr을 unsigned char *로 형변환해야 한다.
-->
unsigned char
는모든 bit를 투명하게 볼 수 있는 특성
을 제공한다.
즉 다른 type은 내부 비트의 일부를 값을 표현하기 위한 용도가 아닌다른 용도
로 사용할 수 있으나 unsigned char는 이것이 허락되지 않아 mem함수, str함수에서는 unsigned char을 이용한다.
또한 메모리 주소의 경우 부호 있는 정수 타입을 쓰면 안된다.
-
void 포인터 연산 시 unsigned char 포인터를 이용한다.
--> void 포인터 연산은 호환성을 위해 사용하지 않는 것이 좋다. 메모리 주소에 부호 있는 정수 타입을 쓰면 올바르게 동작하지 않기 때문에 비부호로 처리해야 한다.void 포인터의 경우 음수를 저장할 때 2의 보수 형태로 저장하게 된다. 단순히 부호 여부가 아닌 데이터를 저장하는 방식이 달라진다고 한다.
참고 : 링크텍스트
4. 코드 구현
#include "libft.h"
void *ft_memchr(const void *ptr, int value, size_t num)
{
size_t index;
unsigned char *cp;
cp = (unsigned char *)(ptr);//unsigned char *로 ptr 형변환
index = 0;
while (index < num)
{
if (cp[index] == (unsigned char)(value))//value를 ptr에서 찾으면
{
return (&cp[index]);//그 주소값 리턴
}
index++;
}
return (0);//찾지 못하면 NULL리턴
}
5. 코드 구현 방법
(1) ptr을 unsigned char *형으로 형변환
(2) num보다 index가 작을 때까지 검색
(3) 만약 value를 ptr에서 찾으면 그 value가 들어 있는 ptr의 주소값 반환
(4) value를 찾지 못하면 NULL리턴.
Author And Source
이 문제에 관하여(ft_memchr 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yeunjoo121/ftmemchr저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)