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 함수를 활용해서 버그없는 안전하고 실현가능한 코드를 작성해보세요.
![[C언어] strcmp 함수 사용법 – 리턴값 의미와 strncmp 차이](https://php-mag.net/wp-content/uploads/2026/01/php-mag.net-G-15.png)








