Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++에서 strncmp()와 strcmp()의 차이점: 안전한 문자열 비교 방법

C 언어의 strcmp()strncmp() 함수는 모두 두 문자열을 ASCII 문자 코드 기준으로 비교하는 표준 라이브러리 함수입니다. 두 함수의 가장 큰 차이점은 비교 연산을 종료하는 조건에 있으며, 이 차이가 프로그램의 안정성에 직결됩니다.

strcmp() 함수란?

strcmp()는 문자열 끝에 있는 널 종료 문자('\0')를 만날 때까지 두 문자열을 계속 비교합니다. 따라서 인자로 전달된 문자열이 반드시 널 문자로 끝나야 정상적으로 동작합니다. 만약 문자열이 유효하지 않아(널 종료 문자가 없어) 널 문자를 찾지 못하면 함수가 연산을 마치지 못하고 버퍼 범위를 벗어난 메모리를 읽는 등 정의되지 않은 동작(undefined behavior)이 발생할 수 있습니다.

strncmp() 함수란?

strncmp()strcmp()와 달리 세 번째 매개변수로 비교할 최대 문자 수(n)를 추가로 받습니다. 지정된 문자 수만큼만 비교한 후 연산을 종료하기 때문에, 널 종료 문자가 없는 불완전한 문자열을 다룰 때도 안전하게 동작합니다. 이러한 특성 덕분에 고정 길이 버퍼나 네트워크 패킷처럼 길이가 명확한 데이터를 비교할 때 특히 유용합니다.

주요 차이점 요약

  • strcmp(str1, str2): 널 문자('\0')를 만날 때까지 전체 문자열을 비교
  • strncmp(str1, str2, n): 최대 n개의 문자까지만 비교한 후 종료
  • 두 함수 모두 반환값이 0이면 두 문자열이 같다는 의미
  • 반환값이 0보다 크면 str1이 사전순으로 뒤에 위치, 0보다 작으면 str1이 앞에 위치

예제 코드

#include <stdio.h>

int main() {
    char str1[] = "TutorialsPoint";
    char str2[] = "Tutorials";

    // strncmp()로 처음 9개 문자 비교
    int result1 = strncmp(str1, str2, 9);
    if(result1 == 0){
        printf("str1 == str2 upto 9 characters!\n");
    }

    // strcmp()로 전체 문자열 비교
    int result2 = strcmp(str1, str2);
    if(result2 == 0){
        printf("str1 == str2!\n");
    } else {
        if(result2 > 0){
            printf("str1 > str2!\n");
        } else {
            printf("str1 < str2!\n");
        }
    }
    return 0;
}

실행 결과

str1 == str2 upto 9 characters!
str1 > str2!

위 예제에서 str1("TutorialsPoint")과 str2("Tutorials")는 처음 9글자가 동일하므로 strncmp()의 결과는 0이 됩니다. 반면 strcmp()는 널 문자를 만날 때까지 전체를 비교하므로, 더 긴 str1이 더 큰 값으로 평가되어 "str1 > str2!"가 출력됩니다.

정리하면, 문자열이 항상 널 종료 문자로 끝난다는 것이 보장된다면 strcmp()를 사용해도 무방하지만, 외부 입력이나 길이가 불명확한 데이터를 다룰 때는 비교 범위를 제한하는 strncmp()를 사용하는 것이 훨씬 안전한 선택입니다.