[42seoul] memcmp는 어떤 함수일까?

개발하는 곰댕이·2021년 4월 9일
0

42Seoul

목록 보기
20/45
  • include

#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);
  • 인자

    • s1
      우리가 비교할 첫 번째 블럭
    • s2
      우리가 비교할 두 번째 블럭
    • n
      n byte만큼 검사한다.

1. memcmp란??

두 문자열이 다른지, 어디가 더 크거나 작은지 비교하는 함수이고 n을 받아서 검사 할 범위를 정할 수 있다. 그리고 아스키코드값으로 비교를 하기 때문에 대문자 , 소문자도 비교가 된다.

앞 문자열이 더 크다면 양수를, 뒷 문자열이 더 크다면 음수를, 둘이 동일하다면 0을 반환한다.

strcmp와 똑같아 보이지만 이 녀석은 int형 배열도 검사를 할 수 있다.

int형 배열이 동일한 값을 가지고 있는지 검사를 할 것이다. 한번 검사를 해 보자.

2. 사용 예제

부끄러운 내 코드...

출력을 확인해 보자.

이런 식으로 각 byte마다 검사를 하며 동일한지 확인을 하게 된다.

값을 다르게 줘 보자.

출력을 확인해 보자

어? 왜 6번만 반복하지? 그리고 왜 181, 4..? 8..? 왜 이렇게 출력이 되지?

모두 다 int형을 unsigned char의 형태로 형변환 하는 과정에서 일어난다.

우리가 넣은 숫자들을 2진법으로 표현하면 이렇게 표현이 된다. 여기서 unsigned char로 형변환이 이루어 지면 가장 뒷 마디, 즉 214라면 1101 0110이 되고 2229는 1011 0101이 된다. 이런 식으로 가장 뒷 마디를 제외하고 모두 무시를 하는 방식으로 형변환이 이루어진다.

여기서 2292를 형 변환 했을때 나온 1011 0101을 10진법으로 바꾸면? 181이 된다. 그런 식으로 형변환 과정에서 나온 숫자이고, 이후 8이나 3도 마찬가지이다.

반복 횟수는??

간단하다. 검사 하면서 검사한 값이 다르면 리턴이 되기 때문에 6번째 검사에서 리턴이 되기 때문에 그런 것이다.

이런 식으로 1Byte씩 검사를 하면서 진행하는게 memcmp이다.

3. 리턴 값

s1과 s2가 같다면 0, s1이 더 크다면 양수, s2가 더 크다면 음수를 반환한다.

0개의 댓글