티스토리 뷰
틀린 내용이나 지식이 있다면 댓글로 알려주세요! 감사합니다!
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
: 비교할 문자열 1ptr2
: 비교할 문자열 2num
: num만큼의 복사를 한다.
memcmp 목적
- 두 개의 메모리 블록을 비교한다.
ptr1
이 가리키는 처음num
바이트의 데이터와ptr2
가 가리키는 처음num
바이트의 데이터를 비교하여 이들이 같다면 0 을 리턴하고 다르다면 0 이 아닌 값을 리턴한다. 이 때 리턴되는 값은 아래를 참고.
Return Value
- 두 개의 메모리 블록의 관계에 따라 아래와 같이 정수 값을 리턴한다.
- 만일 두 메모리 블록이 정확히 같다면 0 을 리턴한다.
- 만일 두 메모리 블록이 다를 경우,
ptr1
과ptr2
가 가리키는 메모리 블록에서 앞에서 부터 처음으로 다른 바이트를 살펴 보는데, 그 바이트를unsigned char
로 해석하였을 때, 그 값이ptr1
이 더 크면 0 보다 큰 값을, 아니면 0 보다 작은 값을 리턴한다. abcde
와adecd
를 입력하였을 때,abcde
가adecd
보다 작게 나온다. 이는 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 :
'TIL(Today I Learn) > C++' 카테고리의 다른 글
is함수들 구현 (isalpha, isdigit, isascii, isalnum, isspace) (0) | 2021.01.07 |
---|---|
strchr, strnstr, strncmp 함수 구현 (0) | 2021.01.07 |
strlen, strlcpy, strlcat 함수 구현(2021.01.07 업데이트) (21) | 2021.01.03 |
memcpy, memccpy, memmove 함수 구현 (2021.01.07 업데이트) (7) | 2020.12.29 |
memset, bzero 함수 구현 (0) | 2020.12.29 |
- Total
- Today
- Yesterday
- 42서울 합격
- css
- c언어 함수
- React
- 프로그래머스 코딩테스트
- git vi
- vscode
- 알고리즘
- html
- vscode commit vi
- flexbox
- 백준
- JS
- JavaScript
- C언어문제
- 마크다운 이미지 업로드
- 42서울
- c언어알고리즘
- C언어 문제
- 자바스크립트
- 프로그래머스 자바
- 42seoul
- C언어
- 프로그래머스 코테
- 42서울 라피신
- HEXO
- Git
- windows 10 ubuntu
- 42서울 합격 후기
- 프로그래머스 카카오
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |