C언어/string.h

[C언어] strncmp 함수 (지정한 길이만큼 문자열 비교)

아무일도없었다 2023. 7. 31. 09:26

사용범위

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

기능

C언어 표준 함수로 지정한 길이만큼 문자열을 비교할 때 사용한다.

헤더

#include <string.h>

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


함수

int strncmp(const char* str1, const char *str2, size_t size);

파라미터

  • const char* str1
    • 비교할 첫번째 문자열(포인터) 버퍼를 입력한다. (반드시 유효한 포인터(주소)를 입력해야 한다.)
    • NULL 문자로 종료되는 문자열을 권장한다.
  • const char* str2
    • 비교할 두번째 문자열(포인터) 버퍼를 입력한다. (반드시 유효한 포인터(주소)를 입력해야 한다.)
    • NULL 문자로 종료되는 문자열을 권장한다.
  • size_t size
    • str1과 str2의 문자열을 비교할 바이트 크기를 입력한다.

반환값 (return)

-1 : str1의 문자열이 str2 보다 작은 경우 ( str1 < str2 
 0 : str1과 str2의 문자열이 동일한 경우 ( str1 == str2 )
 1 : str1의 문자열이 str2 보다 큰 경우 ( str1 > str2 )

0 인 경우 두 문자열이 동일하다.
0 이 아닌 경우 두 문자열은 서로 다르다.

잡학지식

strncmp는 특정 길이만큼의 문자열 비교 시 자주 사용된다.

strcmp와는 다르게 NULL 문자 또는 서로 다른 문자가 나올 때까지 비교하는 게 아니라 지정한 크기만큼 비교를 하기 때문에 훨씬 안전하게 사용이 가능하기 때문이다.

 

하지만 strncmp는 strcmp처럼 문자열을 비교하는 함수이기 때문에 NULL문자를 만나면 지정한 크기만큼 비교를 모두 하지 않고 반환된다.

 

따라서 문자열이 아닌 버퍼의 데이터 동일 유무를 비교하는 용도로 사용하기에는 적합하지 않다.

 

특히 네트워크에서 버퍼를 전송하는 경우 앞쪽에 문자열은 같을지라도 버퍼의 뒷에 남아있는 쓰레기 값이 서버에서 문제가 될 가능성이 있으므로, 버퍼의 데이터 동일 유무를 비교할때는 memcmp를 사용하여 binary 데이터를 모두 확인하는 것이 바람직하다.


 

<소스 코드>

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

int test_strncmp()
{
    char buffer1[8] = {0x12, 0x35, 0x79, 0x7B, 0x00, 0x24, 0x68, 0x00};
    char buffer2[8] = {0x12, 0x35, 0x79, 0x7B, 0x00, 0x13, 0x57, 0x00};

    int ret;

    ret = strncmp(buffer1, buffer2, 8);

    printf("[test_strncmp] strncmp(buffer1, buffer2, 8) = %d\n", ret);

    return 0;
}

int test_strncmp_vs_memcmp()
{
    char buffer1[8] = {0x12, 0x35, 0x79, 0x7B, 0x00, 0x24, 0x68, 0x00};
    char buffer2[8] = {0x12, 0x35, 0x79, 0x7B, 0x00, 0x13, 0x57, 0x00};

    int ret;

    ret = strncmp(buffer1, buffer2, 8);

    printf("[test_strncmp_vs_memcmp] strncmp(buffer1, buffer2, 8) = %d\n", ret);

    ret = memcmp(buffer1, buffer2, 8);

    printf("[test_strncmp_vs_memcmp] memcmp(buffer1, buffer2, 8) = %d\n", ret);

    return 0;
}

int main() {
    test_strncmp();
    test_strncmp_vs_memcmp();
    
    return 0;
}

 

※ 실행 결과

[test_strncmp] strncmp(buffer1, buffer2, 8) = 0
[test_strncmp_vs_memcmp] strncmp(buffer1, buffer2, 8) = 0
[test_strncmp_vs_memcmp] memcmp(buffer1, buffer2, 8) = 1

 

strncmp는 size를 buffer 크기만큼 할당해도 문자열의 기준인 NULL(0x00) 문자까지만 비교를 하기 때문에 두 buffer가 동일하다는 반환값(0)을 확인할 수 있다.
반응형