[C언어] strcmp 함수 사용법 – 리턴값 의미와 strncmp 차이

[C언어] strcmp 함수 사용법 – 리턴값 의미와 strncmp 차이

C언어에서 문자열 비교는 초보자부터 실무 개발자까지 반드시 정확히 이해해야 하는 기본 개념인데요. 특히 문자열은 숫자처럼 == 연산자로 비교할 수 없기 때문에, 표준 라이브러리 함수의 사용이 필수입니다. 이때 가장 많이 사용되는 함수가 바로 strcmp 함수인데요. 하지만 사용자들이 “같다, 다르다” 정도로만 알고 사용하면 예상치 못한 버그를 만들기 쉽습니다. 이 글에서는 c언어 strcmp의 동작 원리와 strcmp 리턴값의 정확한 의미, 그리고 자주 함께 언급되는 strncmp와의 차이까지 차분하게 정리해보겠습니다.

목차

strcmp 함수란 무엇인가 – 문자열 비교의 기본 원리

(출처:JavaCampus)

C언어에서 문자열은 ‘\0′(널 문자)로 끝나는 문자 배열이므로, ==로 “내용”을 비교할 수 없습니다. 이때 strcmp 함수가 두 문자열을 앞에서부터 한 글자씩 비교해, 사전식(lexicographical) 순서로 결과를 반환하는 강력한 함수인데요. 문자열 비교가 필요한 거의 모든 로직(로그인, 명령어 파싱, 정렬)에 기본으로 들어가기 때문에, c언어 strcmp의 비교 방식과 반환 규칙을 먼저 잡아두는 것이 안전합니다.

#include <stdio.h>

#include <string.h>

int main(void) {

    const char *s1 = “cat”;

    const char *s2 = “car”;

    int r = strcmp(s1, s2);  // ‘t’ vs ‘r’에서 차이 발생

    printf(“strcmp(\”%s\”,\”%s\”) = %d\n”, s1, s2, r);

    return 0;

}

위 코드는 같은 접두사 “ca”를 지나, 세 번째 글자에서 비교가 끝납니다. 즉, strcmp는 “전체 길이”를 먼저 비교하는 방식이 아니라 “처음 다른 지점”에서 결론을 내리는 기능인데요. 

strcmp 함수 기본 사용법과 함수 형태

(출처:블로그)

strcmp는 <string.h>에 정의되어 있고, 함수 원형은 다음과 같습니다. 반환값은 정수이며 “참/거짓”이 아니라 비교 결과의 방향성을 저장하는 구조인데요.

#include <string.h>

int strcmp(const char *str1, const char *str2);

조건문에선 반드시 == 0, < 0, > 0 형태로 사용해야 하는데 아래처럼 strcmp 을 활용하여 “동일 여부”를 체크하는 패턴이 가장 흔하게 쓰입니다. 

#include <stdio.h>

#include <string.h>

int main(void) {

    const char *a = “hello”;

    const char *b = “hello”;

    if (strcmp(a, b) == 0) {

        puts(“same”);

    } else {

        puts(“different”);

    }

    return 0;

}

strcmp 리턴값 의미 – 0, 음수, 양수의 정확한 해석

strcmp 리턴값은 0을 기준으로 다음처럼 해석합니다.

  • 0 : 두 문자열이 완전히 같음
  • < 0 : 첫 문자열이 사전적으로 “앞”
  • > 0 : 첫 문자열이 사전적으로 “뒤”

여기서 중요한 점은 구현/플랫폼에 따라 -1이 나올 수도, -32가 나올 수도 있다는 것인데요. 따라서 == -1 같은 비교는 위험합니다.

#include <stdio.h>

#include <string.h>

int main(void) {

    printf(“%d\n”, strcmp(“A”, “a”)); // 보통 음수(대문자 아스키 < 소문자)

    printf(“%d\n”, strcmp(“a”, “A”)); // 보통 양수

    printf(“%d\n”, strcmp(“abc”, “abc”)); // 0

    return 0;

}

여기서 숫자의 “정확한 값”이 아니라 부호(음/양/0)가 의미입니다. 실무에서도 이 규칙만 지키면 대부분의 문자열 비교 버그를 차단할 수 있습니다.

strncmp 함수란 무엇인가 – 비교 길이를 제한하는 이유

strncmp는 strcmp와 원리는 같지만, 앞에서부터 최대 n글자까지만 비교하는 점이 차이점인데요. 긴 입력에서 앞부분만 확인할 때 특히 유용합니다.

#include <stdio.h>

#include <string.h>

int main(void) {

    const char *s = “command:open”;

    // 앞 7글자 “command”만 비교

    if (strncmp(s, “command”, 7) == 0) {

        puts(“prefix matched”);

    }

    return 0;

}

사용자 입력, 프로토콜 헤더, 파일 포맷 식별처럼 “접두사 검증”이 필요한 경우에 strncmp를 쓰면 의도가 명확해지고, 비교 범위를 제한하므로 코드의 안정성도 좋아집니다.

strcmp와 strncmp 차이 – 언제 어떤 함수를 써야 할까

(출처:스무디 TV)

두 함수의 핵심 차이는 “끝까지 비교하느냐” vs “n까지만 비교하느냐”입니다.

  • 전체 동일 여부: strcmp(a, b) == 0
  • 접두사/부분 비교: strncmp(a, b, n) == 0

예를 들어 파일 확장자 검사처럼 “마지막 몇 글자”를 비교하고 싶을 때는 보통 포인터를 이동시킨 뒤 strcmp/strncmp를 쓸 수 있는데요.

#include <stdio.h>

#include <string.h>

int has_ext_png(const char *name) {

    size_t len = strlen(name);

    if (len < 4) return 0;                 // “.png” 길이

    return strcmp(name + (len – 4), “.png”) == 0;

}

int main(void) {

    printf(“%d\n”, has_ext_png(“a.png”));  // 1

    printf(“%d\n”, has_ext_png(“a.jpg”));  // 0

    return 0;

}

실전 예시 ① 로그인 ID 비교에서 strcmp 활용

(출처:한빛미디어)

로그인처럼 “정확히 같은 문자열인지”가 중요할 때는 strcmp가 정답입니다. 비교는 반드시 == 0로 처리하는 걸 추천드려요.

#include <stdio.h>

#include <string.h>

int main(void) {

    const char *saved_id = “admin”;

    char input_id[32] = “admin”; // 예시: 실제로는 fgets 등으로 입력 받음

    if (strcmp(saved_id, input_id) == 0) {

        puts(“ID matched”);

    } else {

        puts(“ID mismatch”);

    }

    return 0;

}

현업에서는 입력에 개행 문자(\n)가 붙는 경우가 많기 때문에 입력 전처리(트림)가 필요할 수 있는데요. 그 상태에서 strcmp를 쓰는 습관을 들이면 “왜 안 맞지?” 같은 시간을 크게 줄일 수 있습니다.

실전 예시 ② 명령어 판별에서 strncmp 활용

사용자 입력이 “exit”, “help”, “open “처럼 시작하는지 판단할 때 strncmp가 깔끔합니다. 입력이 “open file.txt”처럼 뒤에 인자가 붙어도 접두사가 맞으면 빠르게 처리할 수 있는데요.

#include <stdio.h>

#include <string.h>

int main(void) {

    char cmd[64] = “open file.txt”;

    if (strncmp(cmd, “exit”, 4) == 0) {

        puts(“exit command”);

    } else if (strncmp(cmd, “help”, 4) == 0) {

        puts(“help command”);

    } else if (strncmp(cmd, “open “, 5) == 0) {

        puts(“open command with args”);

    } else {

        puts(“unknown”);

    }

    return 0;

}

이 패턴은 실제로 CLI 도구, 간단한 서버, 테스트 유틸리티 등에서 매우 자주 쓰이고, 비교 길이를 고정하면 성능보다 의도 표현이 명확해지는 장점을 가지고 있습니다. 

마무리

strcmp 함수는 C언어 문자열 비교를 구현할 수 있는 강력한 함수이며, 반환값을 “0/음수/양수”로 정확히 해석하는 것이 핵심입니다. strncmp는 비교 범위를 제한해서 접두사 판별과 입력 검증에서 강점을 갖는데요. 위의 실전 예시(로그인, 명령어 처리, 정렬)와 실수 방지 패턴만 익혀두면, 문자열 비교로 생기는 오류를 크게 줄일 수 있습니다. 특히 strcmp 리턴값을 특정 숫자로 가정하지 않는 습관이 가장 강력한 안전장치가 될 수 있는데요. strcmp, strncmp 함수를 활용해서 버그없는 안전하고 실현가능한 코드를 작성해보세요. 

글쓴이

진서율のアバター 진서율 13년차 시트 마스터

안녕하세요, 스프레드시트의 구조와 함수 활용 방식을 일상 업무에 맞게 정리해 온 진서율입니다.
복잡해 보이는 계산식과 문서 구성도 쉽게 이해할 수 있도록 핵심 원리를 중심으로 설명하며, 효율적인 데이터 관리 방법을 꾸준히 연구해 왔습니다.
작업 시간을 줄이고 업무 흐름을 안정적으로 만드는 데 도움이 될 수 있도록, 명확한 기준과 실용적인 팁을 바탕으로 콘텐츠를 이어가겠습니다.

목차