c 언어/c 표준 라이브러리(Standard C Library)

C 언어 문자열 비교 API - strcmp와 strncmp

임베디드 친구 2025. 2. 11. 17:10
728x90
반응형

C 언어에서 문자열을 비교할 때 가장 많이 사용되는 표준 라이브러리 함수는 strcmpstrncmp입니다. 이 두 함수는 문자열의 사전순 비교를 수행하며, string.h 헤더 파일에 선언되어 있습니다.

이번 포스팅에서는 strcmpstrncmp의 사용법과 차이를 살펴보고, 다양한 예제를 통해 이해를 돕겠습니다.


strcmp 함수

함수 프로토타입

#include <string.h>
int strcmp(const char *str1, const char *str2);

기능

  • strcmp 함수는 두 문자열을 비교하여 그 차이를 정수 값으로 반환합니다.
  • 반환 값:
    • 0: 두 문자열이 동일함
    • 양수: str1str2보다 사전적으로 큰 경우
    • 음수: str1str2보다 사전적으로 작은 경우

예제 코드

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

int main() {
    char str1[] = "apple";
    char str2[] = "banana";
    char str3[] = "apple";

    int result1 = strcmp(str1, str2);
    int result2 = strcmp(str1, str3);
    int result3 = strcmp(str2, str1);

    printf("strcmp(str1, str2) = %d\n", result1); // 음수
    printf("strcmp(str1, str3) = %d\n", result2); // 0
    printf("strcmp(str2, str1) = %d\n", result3); // 양수

    return 0;
}

실행 결과

strcmp(str1, str2) = -1
strcmp(str1, str3) = 0
strcmp(str2, str1) = 1

strcmp("apple", "banana")의 결과가 음수인 이유는 'a'가 'b'보다 앞에 오기 때문입니다.


strncmp 함수

함수 프로토타입

#include <string.h>
int strncmp(const char *str1, const char *str2, size_t n);

기능

  • strncmp 함수는 두 문자열을 n개의 문자만 비교하여 결과를 반환합니다.
  • 반환 값은 strcmp와 동일합니다.
  • n 개의 문자까지만 비교하기 때문에 문자열의 일부만 비교하고 싶을 때 유용합니다.

예제 코드

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

int main() {
    char str1[] = "apple";
    char str2[] = "apricot";

    int result1 = strncmp(str1, str2, 3);
    int result2 = strncmp(str1, str2, 5);

    printf("strncmp(str1, str2, 3) = %d\n", result1); // 0 (앞 3글자가 동일)
    printf("strncmp(str1, str2, 5) = %d\n", result2); // 음수

    return 0;
}

실행 결과

strncmp(str1, str2, 3) = 0
strncmp(str1, str2, 5) = -1

앞 3글자는 "app"로 동일하지만, 5글자를 비교하면 "apple"과 "apricot"의 차이가 드러납니다.


strcmp vs strncmp 차이점

함수 비교 범위 용도
strcmp 전체 문자열 두 문자열이 정확히 같은지 비교
strncmp 지정된 길이만큼 문자열의 일부만 비교

strncmp이 유용한 경우

  1. 보안 측면: strncmp을 사용하면 예상치 못한 길이의 문자열 비교로 인해 발생할 수 있는 버퍼 오버플로우 위험을 줄일 수 있습니다.
  2. 부분 비교: 예를 들어, 특정 접두어(prefix)를 비교하는 경우 유용합니다.

활용 예제: 사전순 정렬

배열에 저장된 여러 문자열을 사전순으로 정렬하는 프로그램을 작성해 보겠습니다.

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

void swap(char **a, char **b) {
    char *temp = *a;
    *a = *b;
    *b = temp;
}

void sort_strings(char *arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            if (strcmp(arr[i], arr[j]) > 0) {
                swap(&arr[i], &arr[j]);
            }
        }
    }
}

int main() {
    char *words[] = {"banana", "apple", "cherry", "blueberry"};
    int n = sizeof(words) / sizeof(words[0]);

    sort_strings(words, n);

    printf("정렬된 문자열:\n");
    for (int i = 0; i < n; i++) {
        printf("%s\n", words[i]);
    }

    return 0;
}

실행 결과

정렬된 문자열:
apple
banana
blueberry
cherry

마무리

  • strcmpstrncmp은 문자열을 비교할 때 유용한 함수입니다.
  • strcmp는 전체 문자열을 비교하고, strncmp은 특정 길이만큼 비교할 수 있습니다.
  • 보안과 성능을 고려하여 적절한 함수를 선택하는 것이 중요합니다.

이제 strcmpstrncmp을 활용하여 다양한 문자열 비교 로직을 구현할 수 있습니다.

반응형