반응형
C언어에서 두 문자열이 같은지 확인하거나 사전순으로 누가 앞서는지 판단할 때 사용하는 핵심 함수가 바로 strcmp와 strncmp입니다.
오늘은 이 함수들이 내부적으로 어떻게 동작하는지, 그리고 왜 실무에서는 strncmp를 더 권장하는지 상세히 알아보겠습니다.

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;
}
마무리하며
문자열 비교는 데이터 파싱이나 명령어 처리 등 임베디드 및 시스템 프로그래밍에서 매우 자주 쓰입니다.
- 정확히 같은지 확인할 때는 strcmp를 사용하되 결과값이 0인지 확인하세요.
- 보안이 중요하거나 부분 비교가 필요할 때는 strncmp를 사용하세요.
포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!https://coding-by-head.tistory.com/ - 임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.
반응형
'Core Programming > C Standard Library: Resource & Performan' 카테고리의 다른 글
| C언어 문자열 자르기와 복제: strtok, strdup 완벽 가이드 (메모리 관리 팁) (0) | 2025.02.13 |
|---|---|
| C언어 문자열 검색 완벽 가이드: strchr과 strstr 함수 사용법 및 차이점 (0) | 2025.02.12 |
| C언어 문자열 이어붙이기 완벽 가이드: strcat과 strncat의 안전한 사용법 (0) | 2025.02.10 |
| C언어 문자열 함수 총정리: strlen, strcpy, strncpy 안전한 사용법 (0) | 2025.02.09 |
| C언어 파일 입출력 에러 처리 완벽 가이드 (perror, feof, ferror, clearerr) (0) | 2025.02.08 |