C언어/string.h

[C언어] memcmp 함수 (메모리 비교 함수)

아무일도없었다 2022. 11. 11. 16:43

사용범위

Windows, Unix 등 모든 OS에서 사용 가능한 표준 API 함수

기능

C언어 표준 함수로 memory 데이터를 비교할 때 사용한다.

헤더

#include <string.h>

※ 함수 사용시 string.h 파일을 include 하지 않는다면 컴파일 시 error 발생 ※


함수

int memcmp(const void* buf1, const void* buf2, size_t size);

파라미터

  • const void* buf1
    • 비교할 첫번째 포인터(주소)를 입력한다. (반드시 유효한 포인터(주소)를 입력해야 한다.)
  • const void* buf2
    • 비교할 두 번째 포인터(주소)를 입력한다. (반드시 유효한 포인터(주소)를 입력해야 한다.)
  • size_t size
    • buf1 과 buf2 를 비교할 바이트 크기를 입력한다.

반환값 (return)

-1 : buf1 의 데이터가 buf2 보다 작은 경우 ( buf1 < buf2 
 0 : buf1 과 buf2 가 동일한 경우 ( buf1 == buf2 )
 1 : buf1 이 buf2 보다 큰 경우 ( buf1 > buf2 )

0 인 경우 두 데이터가 동일하다.
0 이 아닌 경우 두 데이터는 서로 다르다.

잡학지식

memcmp 는 보통 이진 데이터의 비교 시 자주 사용된다.

strcmp, strncmp 함수와는 다르게 NULL 문자를 만나도 반드시 size 파라미터의 크기만큼 비교를 진행하기 때문이다.

 

프로젝트를 진행하다 보면 string 데이터 뒤쪽의 쓰레기 값으로 인해 문제가 되는 경우가 있는데 memcmp를 통해 NULL 문자 뒤쪽의 쓰레기 값이 있는지의 유무를 확인할 수도 있다. (아래 예시 코드 참고)

 

// 0 : 쓰레기값 없음
// other : 쓰레기값이 존재
int garbage_value_check(char *data, size_t size) {
    char *tmp = NULL;
    int ret = -1;

    tmp = (char *)calloc(1, size);
    if(tmp && data) {
        ret = memcmp(data, tmp, size);
    }
    return ret;
}

 

<소스 코드>

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

int main() {
    char buffer1[16] = {"ABC"};
    char buffer2[16] = {"abc"};
    int ret;

    ret = memcmp(buffer1, buffer2, sizeof(buffer1));
    if(ret == 0) {
        printf("buffer1 == buffer2\n");
    } else {
        printf("buffer1 != buffer2 (%d)\n", ret);
    }

    return 0;
}

 

※ 실행 결과

buffer1 != buffer2 (-1)

 

반응형