[C언어/C++] 문자열 비교 strcmp, strncmp 함수 사용법 & 예제 + 구현

두 개의 문자열이 같은지 비교하고 싶다면 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;
}

댓글(0)

Designed by JB FACTORY