본문으로 바로가기
728x90
반응형
memcmp() 함수의 헤더 파일
#include <string.h>

 

memcmp() 함수의 원형
int memcmp(const void * ptr1, const void * ptr2, size_t num);

 

Parameter
ptr1
비교할 첫번째 메모리 블럭의 주소를 인자로 받으며 void * 형으로 되어 있다.

ptr2
비교할 두번째 메모리 블럭의 주소를 인자로 받으며 void * 형으로 되어 있다.

num
비교할 문자의 길이이며 size_t 형으로 되어 있다.

 

리턴 값
세가지 형태로 리턴된다.

1. ptr1이 ptr2보다 클 경우 => 0보다 큰 값을 리턴
(첫번째 인자의 문자가 두번째 인자의 문자보다 큰 경우)

2. ptr1ptr2보다 작은 경우 => 0보다 작은 값을 리턴
(첫번째 인자의 문자가 두번째 인자의 문자보다 작은 경우)

3. ptr1ptr2가 같을 경우 => 0을 리턴
(첫번째 인자와 두번째 인자의 문자가 모두 같을 경우)

※자세한 사항은 아래에 기재되어 있어요※

 

string.h 헤더파일에 포함되어 있는 메모리 비교하는 함수 중에 하나인 memcmp() 함수를 한번 파헤쳐보자.

 

 

memcmp() 함수는 문자열 다들 아시다시피 비교함수입니다.

ptr1이 가르키는 메모리 영역과 ptr2이 가르키는 메모리 영역을 num byte 만큼 비교하는 비교 함수이죠.

 

 

Θ memcmp() 함수의 어떻게 동작하는 걸까요?

 

memcmp() 함수는 원하는 byte 만큼의 메모리 영역에 있는 문자를 처음부터 끝까지 비교하여 큰지 작은지를 비교해서 리턴해준답니다.

 

참고, 여기서 문자열이 어떻게 숫자가 되죠??

컴퓨터는 사실 문자를 숫자로 인식해요!! 그걸 정리해놓은 방식이 아스키 코드 인코딩 방식이라고 합니다.
많은 인코딩 방식들이 있지만 아스키 코드를 많이 사용해요!!
아스키 코드에 따라 실제 'L' 문자는 76이고 'l' 문자는 108 이여서 비교가 가능하답니다.
그래서 memcmp() 함수의 리턴값이 3가지 형태인 이유예요

 

Θ memcmp() 메모리 영역보다 큰 값을 비교하면 어떻게 될까?

 

memcmp() 함수의 ptr1, ptr2 인자는 void * 형으로 메모리의 주소를 전달받아요. 그럼 실제 할당되지 않아도 메모리 주소로는 접근이 가능하기 때문에 해당 메모리 영역에 이전에 어떤 상태였는지에 따라서 결과가 다르게 나와 원하지 않는 결과가 나올 수 있어서 주의해야되요!!

 

 

#include <stdio.h>
#include <string.h>

int main(){
  char str1[20] = "HELLO WORLD!!";
  char str2[20] = "HELlo world!!";
  char str3[20] = "HELLO WORLD!!";
  int ret = 0;

  ret = memcmp(str1, str2, 20);			//str1, str2 문자열을 비교

  printf("/%s/ > /%s/ : %d\r\n", str1, str2, ret);

  ret = memcmp(str2, str1, 20);			//str2, str1 문자열을 비교

  printf("/%s/ < /%s/ : %d\r\n", str2, str1, ret);

  ret = memcmp(str1, str3, 20);			//str1, str3 문자열을 비교

  printf("/%s/ == /%s/ : %d\r\n", str1, str3, ret);

  return 0;
}

 

실행 결과

 

#include <stdio.h>
#include <string.h>

int main(){
  char str1[20] = "HELlo world!!";
  char str2[20] = "HELLO WORLD!!";
  char str3[20] = "HELLO WORLD!!";
  char *p;
  int ret = 0;

  ret = memcmp(str1, str2, 20);

  printf("/%s/ > /%s/ : %d\r\n", str1, str2, ret);

  ret = memcmp(str2, str1, 20);

  printf("/%s/ < /%s/ : %d\r\n", str2, str1, ret);

  ret = memcmp(str2, str3, 20);

  printf("/%s/ == /%s/ : %d\r\n", str2, str3, ret);

  //str1의 25byte의 메모리 영역 실제 문자 확인
  p = str1;
  printf("str1 : ");
  for(int i = 0; i<25; i++){
   printf("%c ", *p);
   p++;
  }
  printf("\r\n");

  //str2의 25byte의 메모리 영역 실제 문자 확인
  p = str2;
  printf("str2 : ");
  for(int i = 0; i<25; i++){
   printf("%c ", *p);
   p++;
  }
  printf("\r\n");

  ret = memcmp(str1, str2, 25);

  printf("/%s/ == /%s/ : %d\r\n", str1, str2, ret);

  return 0;
}

 

실행 결과

 

다른 string.h 파일의 함수에 대해 알고 싶으시다면 String.h 함수 파헤치기!!

 

C언어 라이브러리 - String.h 헤더 파일 분석하기(String.h 함수 모음, C언어 래퍼런스)

c언어를 사용하시거나 해보셨던 분들은 대부분 memcpy, memset 함수를 사용해보셨을 텐데요. 해당 함수를 사용하기 위해서는 String.h 파일을 포함시켜줬던 기억이 나실겁니다. 요렇게요 #include #include

idsn.tistory.com

반응형