728x90
반응형
C 언어에서 문자열을 비교할 때 가장 많이 사용되는 표준 라이브러리 함수는 strcmp
와 strncmp
입니다. 이 두 함수는 문자열의 사전순 비교를 수행하며, string.h
헤더 파일에 선언되어 있습니다.
이번 포스팅에서는 strcmp
와 strncmp
의 사용법과 차이를 살펴보고, 다양한 예제를 통해 이해를 돕겠습니다.
strcmp 함수
함수 프로토타입
#include <string.h>
int strcmp(const char *str1, const char *str2);
기능
strcmp
함수는 두 문자열을 비교하여 그 차이를 정수 값으로 반환합니다.- 반환 값:
0
: 두 문자열이 동일함양수
:str1
이str2
보다 사전적으로 큰 경우음수
:str1
이str2
보다 사전적으로 작은 경우
예제 코드
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
char str3[] = "apple";
int result1 = strcmp(str1, str2);
int result2 = strcmp(str1, str3);
int result3 = strcmp(str2, str1);
printf("strcmp(str1, str2) = %d\n", result1); // 음수
printf("strcmp(str1, str3) = %d\n", result2); // 0
printf("strcmp(str2, str1) = %d\n", result3); // 양수
return 0;
}
실행 결과
strcmp(str1, str2) = -1
strcmp(str1, str3) = 0
strcmp(str2, str1) = 1
strcmp("apple", "banana")
의 결과가 음수인 이유는 'a'가 'b'보다 앞에 오기 때문입니다.
strncmp 함수
함수 프로토타입
#include <string.h>
int strncmp(const char *str1, const char *str2, size_t n);
기능
strncmp
함수는 두 문자열을n
개의 문자만 비교하여 결과를 반환합니다.- 반환 값은
strcmp
와 동일합니다. n
개의 문자까지만 비교하기 때문에 문자열의 일부만 비교하고 싶을 때 유용합니다.
예제 코드
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "apricot";
int result1 = strncmp(str1, str2, 3);
int result2 = strncmp(str1, str2, 5);
printf("strncmp(str1, str2, 3) = %d\n", result1); // 0 (앞 3글자가 동일)
printf("strncmp(str1, str2, 5) = %d\n", result2); // 음수
return 0;
}
실행 결과
strncmp(str1, str2, 3) = 0
strncmp(str1, str2, 5) = -1
앞 3글자는 "app"로 동일하지만, 5글자를 비교하면 "apple"과 "apricot"의 차이가 드러납니다.
strcmp vs strncmp 차이점
함수 | 비교 범위 | 용도 |
---|---|---|
strcmp |
전체 문자열 | 두 문자열이 정확히 같은지 비교 |
strncmp |
지정된 길이만큼 | 문자열의 일부만 비교 |
strncmp
이 유용한 경우
- 보안 측면:
strncmp
을 사용하면 예상치 못한 길이의 문자열 비교로 인해 발생할 수 있는 버퍼 오버플로우 위험을 줄일 수 있습니다. - 부분 비교: 예를 들어, 특정 접두어(prefix)를 비교하는 경우 유용합니다.
활용 예제: 사전순 정렬
배열에 저장된 여러 문자열을 사전순으로 정렬하는 프로그램을 작성해 보겠습니다.
#include <stdio.h>
#include <string.h>
void swap(char **a, char **b) {
char *temp = *a;
*a = *b;
*b = temp;
}
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) {
swap(&arr[i], &arr[j]);
}
}
}
}
int main() {
char *words[] = {"banana", "apple", "cherry", "blueberry"};
int n = sizeof(words) / sizeof(words[0]);
sort_strings(words, n);
printf("정렬된 문자열:\n");
for (int i = 0; i < n; i++) {
printf("%s\n", words[i]);
}
return 0;
}
실행 결과
정렬된 문자열:
apple
banana
blueberry
cherry
마무리
strcmp
와strncmp
은 문자열을 비교할 때 유용한 함수입니다.strcmp
는 전체 문자열을 비교하고,strncmp
은 특정 길이만큼 비교할 수 있습니다.- 보안과 성능을 고려하여 적절한 함수를 선택하는 것이 중요합니다.
이제 strcmp
와 strncmp
을 활용하여 다양한 문자열 비교 로직을 구현할 수 있습니다.
반응형
'c 언어 > c 표준 라이브러리(Standard C Library)' 카테고리의 다른 글
C 표준 라이브러리 `string.h`의 문자열 변환 함수 `strtok`, `strdup` (0) | 2025.02.13 |
---|---|
C 언어 `string.h`의 문자열 검색 함수 - `strchr`와 `strstr` (0) | 2025.02.12 |
C 언어 `string.h`의 `strcat`과 `strncat` 함수 이해하기 (0) | 2025.02.10 |
C 표준 라이브러리 string.h 개요 및 문자열 관련 함수 (strlen, strcpy, strncpy) (0) | 2025.02.09 |
파일 에러 처리 함수(perror, clearerr, feof, ferror) - C 언어 (0) | 2025.02.08 |