C 언어의 strcmp()와 strncmp() 함수는 모두 두 문자열을 ASCII 문자 코드 기준으로 비교하는 표준 라이브러리 함수입니다. 두 함수의 가장 큰 차이점은 비교 연산을 종료하는 조건에 있으며, 이 차이가 프로그램의 안정성에 직결됩니다.
strcmp() 함수란?
strcmp()는 문자열 끝에 있는 널 종료 문자('\0')를 만날 때까지 두 문자열을 계속 비교합니다. 따라서 인자로 전달된 문자열이 반드시 널 문자로 끝나야 정상적으로 동작합니다. 만약 문자열이 유효하지 않아(널 종료 문자가 없어) 널 문자를 찾지 못하면 함수가 연산을 마치지 못하고 버퍼 범위를 벗어난 메모리를 읽는 등 정의되지 않은 동작(undefined behavior)이 발생할 수 있습니다.
strncmp() 함수란?
strncmp()는 strcmp()와 달리 세 번째 매개변수로 비교할 최대 문자 수(n)를 추가로 받습니다. 지정된 문자 수만큼만 비교한 후 연산을 종료하기 때문에, 널 종료 문자가 없는 불완전한 문자열을 다룰 때도 안전하게 동작합니다. 이러한 특성 덕분에 고정 길이 버퍼나 네트워크 패킷처럼 길이가 명확한 데이터를 비교할 때 특히 유용합니다.
주요 차이점 요약
- strcmp(str1, str2): 널 문자(
'\0')를 만날 때까지 전체 문자열을 비교 - strncmp(str1, str2, n): 최대 n개의 문자까지만 비교한 후 종료
- 두 함수 모두 반환값이 0이면 두 문자열이 같다는 의미
- 반환값이 0보다 크면 str1이 사전순으로 뒤에 위치, 0보다 작으면 str1이 앞에 위치
예제 코드
#include <stdio.h>
int main() {
char str1[] = "TutorialsPoint";
char str2[] = "Tutorials";
// strncmp()로 처음 9개 문자 비교
int result1 = strncmp(str1, str2, 9);
if(result1 == 0){
printf("str1 == str2 upto 9 characters!\n");
}
// strcmp()로 전체 문자열 비교
int result2 = strcmp(str1, str2);
if(result2 == 0){
printf("str1 == str2!\n");
} else {
if(result2 > 0){
printf("str1 > str2!\n");
} else {
printf("str1 < str2!\n");
}
}
return 0;
}
실행 결과
str1 == str2 upto 9 characters! str1 > str2!
위 예제에서 str1("TutorialsPoint")과 str2("Tutorials")는 처음 9글자가 동일하므로 strncmp()의 결과는 0이 됩니다. 반면 strcmp()는 널 문자를 만날 때까지 전체를 비교하므로, 더 긴 str1이 더 큰 값으로 평가되어 "str1 > str2!"가 출력됩니다.
정리하면, 문자열이 항상 널 종료 문자로 끝난다는 것이 보장된다면 strcmp()를 사용해도 무방하지만, 외부 입력이나 길이가 불명확한 데이터를 다룰 때는 비교 범위를 제한하는 strncmp()를 사용하는 것이 훨씬 안전한 선택입니다.