Coding & Programming/C, C++

[C언어/C++] memcmp() 함수 - 문자열/메모리 데이터 비교 하기 예제 + strcmp(), strncmp() 함수와의 차이점

mainCodes 2021. 4. 24. 13:14

[C언어/C++] memcmp() 함수 - 문자열/메모리 데이터 비교 하기 예제 + strcmp(), strncmp() 함수와의 차이점

 

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

 

memcmp() 함수는 strncmp() 함수와 사용방법이 비슷합니다. 차이점이 있다면 strncmp() 함수는 NULL 문자('\0')가 문자열 내에 존재하면 NULL 문자 전까지의 문자열을 비교하지만 memcmp() 함수는 NULL 문자뿐만 아니라 바이너리 문자들을 포함하여 메모리에 있는 데이터를 비교할 수 있습니다. 따라서 바이너리 문자가 포함된 데이터를 비교하기 위해서는 memcmp() 함수를 이용하는 것이 좋습니다.

 

int memcmp( const void *buffer1, const void *buffer2, size_t count );

 

예제에서는 이를 확인하기 위해 str_a, str_b 변수에 저장된 문자열 중 8번째 원소를 각각 '1'과 'w'로 다르게 하였습니다.

 

이 경우 strcmp(), strncmp() 함수는 중간 NULL 문자로 인해 NULL 문자 전까지만 문자열을 비교하여 문자열이 동일한 것으로 판단합니다. 

 

char str_a[50] = { 'H', 'e', 'l', 'l','o','\0',' ','1','o','r','l','d' };
char str_b[50] = { 'H', 'e', 'l', 'l','o','\0',' ','W','o','r','l','d' };

 

하지만, memcmp()는 NULL 문자를 포함한 데이터를 비교하기 때문에 문자열이 일치하지 않음을 리턴하였습니다. 따라서, NULL 문자 등 바이너리 데이터가 포함되어 있을 경우 memcmp()를 이용해야 합니다.

 

▣ memcpy 함수 예제(Example Code):

 

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
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <string.h>
#include <memory.h>
 
int main()
{
    //총 길이 12바이트의 문자열 변수들
    //str_a와 str_b는 8번째 문자가 서로 다름
    char str_a[50= { 'H''e''l''l','o','\0',' ','1','o','r','l','d' };
    char str_b[50= { 'H''e''l''l','o','\0',' ','W','o','r','l','d' };
    char str_c[50= { 'H''e''l''l','o','\0',' ','W','o','r','l','d' };
    char str_d[50= { 0xAA0xAB0x000xAD0xFF };
    char str_e[50= { 0xAA0xAB0xAC0xAD0xFF };
 
    //strcmp()함수는 NULL('\0')까지만 비교하여 동일한 것으로 결과를 리턴
    if (strcmp(str_a, str_b) == 0)
        printf("strcmp함수  : str_a와 str_b는 문자열이 동일합니다.\n");
    else
        printf("strcmp함수  : str_a와 str_b는 문자열이 동일하지 않습니다.\n");
 
    //maxCount를 12로 지정하였으나 NULL('\0')까지만 비교하여 동일한 것으로 결과를 리턴
    if (strncmp(str_a, str_b, 12== 0)
        printf("strncmp함수 : str_a와 str_b는 문자열이 동일합니다.\n");
    else
        printf("strncmp함수 : str_a와 str_b는 문자열이 동일하지 않습니다.\n");
 
    //정상적으로 동일하지 않음으로 리턴
    if (memcmp(str_a, str_b, 12== 0)
        printf("memcmp함수  : str_a와 str_b는 문자열이 동일합니다.\n");
    else
        printf("memcmp함수  : str_a와 str_b는 문자열이 동일하지 않습니다.\n");
 
    //실제 동일한 str_b, str_c를 비교
    if (memcmp(str_b, str_c, 12== 0)
        printf("memcmp함수  : str_b와 str_c는 문자열이 동일합니다.\n");
    else
        printf("memcmp함수  : str_b와 str_c는 문자열이 동일하지 않습니다.\n");
 
    return 0;
}
cs

 

 실행결과(Output):

상 JollyTree였습니다. (•̀ᴗ•́)و