두 개의 문자열이 같은지 비교하고 싶다면 strcmp, strncmp함수를 사용하면 됩니다. strcmp함수는 비교대상 문자열인 string1 string2이 같은지 비교합니다. strncmp는 문자열을 비교한다는 것에서 일정 길이만큼 비교할 수 있는 옵션이 추가된 함수입니다. 위의 두 함수는 널로 끝나는 스트링에서 작동합니다. 그렇기에 함수에 대한 스트링 인수는 스트링 끝을 나타내는 널 문자(\0)를 포함해야 합니다.
strcmp() : 두 문자열이 같으면 0을, 같지 않으면 0이 아닌 값을 반환합니다.
strncmp() : 두 문자열의 원하는 길이만큼 같으면 0을, 같지 않으면 0이 아닌 값을 반환합니다.
두 함수의 리턴값은 비교 대상의 어떤 문자열이 더 크냐에 따라 달라지게 되는데 문자열의 크기는 아스키코드 값으로 비교하며 첫 번째 인자로 전달된 문자열의 두 번째 인자로 전달된 문자열 보다 크기가 큰 경우 양수를 반환하고 반대로 첫 번째 인자로 전달된 문자열이 두 번째 인자로 전달된 문자열 보다 크기가 작은 경우 음수를 반환하게 됩니다.
strcmp, strncmp 함수 형식
int strcmp(const char* str1, const char*str2);
int strncmp(const char* str1, const char* str2, size_t num);
str1 : 비교할 문자열1
str2 : 비교할 문자열 2
num : 비교할 문자열의 길이
※ size_t는 해당 시스템에서 어떤 객체나 값이 포함할 수 있는 최대 크기의 데이터를 표현하는 타입으로 반드시 unsigned 형으로 나타냅니다.
strcmp, strncmp 사용 예제
#include <stdio.h>
#include <string.h>//함수가 선언된 헤더 파일
//#include <cstring> //C++일 경우
int main()
{
char s1[10] = "aaa";
char s2[10] = "aaa";
char s3[10] = "aab";
int compare1 = strcmp(s1, s2);//strcmp 입력된 문자열 비교
int compare2 = strcmp(s1, s3);
int compare3 = strcmp(s3, s1);
int compare4 = strncmp(s1, s3, 2);//strncmp 입력된 문자열을 2번째까지 비교
int compare5 = strncmp(s3, s1, 2);
//strcmp
printf("결과1 : %d\n", compare1); //0
printf("결과2 : %d\n", compare2); //음수
printf("결과3 : %d\n", compare3); //양수
if (!strcmp(s1, s2))printf("s1과 s2은 같습니다.\n");
if (strcmp(s1, s3))printf("s1과 s3은 다릅니다.\n");
//strncmp
printf("결과4 : %d\n", compare4); //0
printf("결과5 : %d\n", compare5); //0
if (!strncmp(s1, s2, 2))printf("s1과 s2은 2째 자리까지 같습니다.\n");
if (!strncmp(s1, s3, 2))printf("s1과 s3은 2째 자리까지 같습니다.\n");
return 0;
}
결과1의 경우 두 문자열이 서로 같기에 0이 리턴되고 결과2의 경우는 첫 번째 인자 값인 aaa보다 aab가 아스키코드값이 더 크므로 음수인 -1이 출력되었습니다. 3번의 경우는 그 반대로 양수인 1이 출력되었습니다. 결과4번 5번의 경우는 strncmp함수를 활용하여 2번째 자리까지만 비교하였으므로 aa == aa가 되어 0이 출력되었습니다.
strcmp, strncmp 함수 구현
#include <stdio.h>
int my_strcmp(char* str1, char* str2)
{
int i = 0;
// 한쪽 문자열이 끝날 때까지 비교 수행
while (str1[i] != '\0' || str2[i] != '\0') {
// 문자 같으면 계속 비교
if (str1[i] == str2[i]) {
i++;
continue;
}
// 앞의 문자가 더 크면 1 리턴
else if (str1[i] > str2[i])return 1;
// 뒤의 문자가 더 크면 -1 리턴
else if (str1[i] < str2[i])return -1;
i++;
}
// 어느 한쪽 문자열이 끝났고 i - 1 까지 모두 같은 상태
if (str1[i] == str2[i])return 0; // str1[i] == str2[i] == '\0' 이라면 0 리턴
else if (str1[i] != '\0')return 1; // str1에 글자가 남아있으면 1 리턴
else return -1; // str2에 글자가 남아있으면 -1 리턴
}
int my_strncmp(char* str1, char* str2, int n)
{
int i = 0;
// 한쪽 문자열이 끝날 때까지 또는 n 보다 작을 때 비교 수행
while (i < n && (str1[i] != '\0' || str2[i] != '\0')) {
// 문자 같으면 계속 비교
if (str1[i] == str2[i]) {
i++;
continue;
}
else if (str1[i] > str2[i]) return 1; // 앞의 문자가 더 크면 1 리턴
else if (str1[i] < str2[i]) return -1; // 뒤의 문자가 더 크면 -1 리턴
i++;
}
// 어느 한쪽 문자열이 끝나거나 n 갯수만큼 비교한 후
if (n == i)return 0; //i == n이라면 찾는 갯수 안의 문자는 모두 같음, 0 리턴
else if (str1[i] == '\0' && str2[i] == '\0')return 0; //문자열 끝났으면 0 리턴
else if (str1[i] > str2[i])return 1; //둘 중 하나라도 문자열 남아 있으면 비교
else return -1;
}
int main()
{
char s1[10] = "aaa";
char s2[10] = "aab";
printf("strcmp : %d\n",my_strcmp(s1,s2)); //strcmp
printf("strncmp : %d\n",my_strncmp(s1,s2,2)); //strncmp
return 0;
}
'Language > C , C++ , C#' 카테고리의 다른 글
[C++] STL vector 사용법 & 예제 총정리 (8) | 2020.09.02 |
---|---|
[C++] STL 정렬 sort 함수 사용법 & 예제 (오름차순 , 내림차순) (2) | 2020.09.01 |
[C언어,C++] 문자열 합치기 strcat, strncat 함수 사용법 & 예제 +구현 (0) | 2020.08.30 |
[C언어/C++] 문자열 자르기 (strtok, strtok_s) 함수 사용법 & 예제 +구현 (0) | 2020.08.29 |