Core Programming/C Standard Library: Resource & Performan

C언어 문자열 비교 완벽 가이드: strcmp와 strncmp 사용법 및 원리

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

C언어에서 두 문자열이 같은지 확인하거나 사전순으로 누가 앞서는지 판단할 때 사용하는 핵심 함수가 바로 strcmp와 strncmp입니다.

오늘은 이 함수들이 내부적으로 어떻게 동작하는지, 그리고 왜 실무에서는 strncmp를 더 권장하는지 상세히 알아보겠습니다.

Generated by Gemini AI.


1. strcmp 함수: 전체 문자열 비교

strcmp는 두 문자열을 첫 번째 문자부터 하나씩 비교하여 처음으로 다른 문자가 나타나거나 널 문자(\0)를 만날 때까지 검사합니다.

1.1 함수 프로토타입

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

1.2 반환 값의 비밀 (ASCII 코드)

많은 분이 단순히 -1, 0, 1만 반환된다고 알고 있지만, 실제로는 비교한 두 문자의 ASCII 값 차이를 반환합니다.

  • 0: 두 문자열이 완벽히 일치함.
  • 양수: str1의 ASCII 값이 더 큼 (사전순으로 뒤에 위치).
  • 음수: str1의 ASCII 값이 더 작음 (사전순으로 앞에 위치).

1.3 기초 예제

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

int main() {
    char s1[] = "apple";
    char s2[] = "banana";

    if (strcmp(s1, s2) < 0) {
        printf("'apple'은 'banana'보다 앞에 있습니다.\n");
    }
    return 0;
}

2. strncmp 함수: 지정된 길이만큼 비교

strncmp는 비교할 문자의 개수(n)를 제한할 수 있습니다. 이는 특정 접두사(Prefix)를 확인하거나 메모리 보안을 강화할 때 필수적입니다.

2.1 함수 프로토타입

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

2.2 부분 비교 예제

"apple"과 "apricot"은 앞 2글자 "ap"는 같지만 3번째 글자부터 달라집니다.

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

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

    // 앞 2글자만 비교
    if (strncmp(str1, str2, 2) == 0) {
        printf("앞 2글자가 일치합니다.\n");
    }

    // 앞 3글자 비교 ('p' vs 'r')
    printf("3글자 비교 결과: %d\n", strncmp(str1, str2, 3)); // 음수 반환
    return 0;
}

3. strcmp vs strncmp 한눈에 비교

구분 strcmp strncmp
비교 범위 문자열 전체 (\0까지) 지정된 n개 문자까지
안전성 버퍼 오버런 위험 존재 상대적으로 안전함
주요 용도 완전 일치 여부 확인 접두어 확인, 부분 일치 검사

4. [중요] 흔히 하는 실수: 조건문 사용법

초보자들이 가장 많이 하는 실수는 if 문에서 strcmp를 바로 사용하는 것입니다.

C
 
// ❌ 잘못된 예
if (strcmp(str1, str2)) { 
    // 두 문자열이 같으면 0(거짓)이 반환되어 이 블록이 실행되지 않습니다!
}

// ✅ 올바른 예
if (strcmp(str1, str2) == 0) {
    // 두 문자열이 같은 경우 실행
}

5. 실전 응용: 문자열 사전순 정렬

문자열 배열을 사전순으로 정렬하는 버블 정렬 예제입니다. strcmp의 반환값이 양수일 때 위치를 바꿈으로써 오름차순 정렬을 구현합니다.

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

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) {
                char *temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

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

    sort_strings(words, n);

    for (int i = 0; i < n; i++) printf("%s ", words[i]);
    return 0;
}

마무리하며

문자열 비교는 데이터 파싱이나 명령어 처리 등 임베디드 및 시스템 프로그래밍에서 매우 자주 쓰입니다.

  1. 정확히 같은지 확인할 때는 strcmp를 사용하되 결과값이 0인지 확인하세요.
  2. 보안이 중요하거나 부분 비교가 필요할 때는 strncmp를 사용하세요.

    포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!https://coding-by-head.tistory.com/
  3. 임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.
반응형