반응형

안녕하세요.

오늘은 C언어에서 문자열을 비교할 수 있는 함수인 strcmp와 strncmp 함수에 대해 알아보도록 하겠습니다.

strcmp

함수 원형
int strcmp( const char *string1, const char *string2);

헤더 파일
string.h

설명
두 문자열을 비교합니다.
string1과 string2 두 문자열을 비교합니다.

리턴값
리턴값이 -1 일 때 -> 두 문자열을 비교하여, 틀린 첫번째 문자가 string1이 더 작을 때 -1을 리턴합니다.
리턴값이 0 일 때 -> 두 문자열이 같습니다.
리턴값이 1 일 때 -> 두 문자열을 비교하여, 틀린 첫번째 문자가 string1이 더 클 때 1을 리턴합니다.

예제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
 
void main()
{
    char arrString1[20= "world!!";
    char arrString2[20= "worlc!!";
    char arrString3[20= "worlf!!";
    char arrString4[20= "world!!";
 
    int nReturn1 = strcmp(arrString1, arrString2);
    int nReturn2 = strcmp(arrString1, arrString3);
    int nReturn3 = strcmp(arrString1, arrString4);
 
    
    printf("strcmp(%s, %s) return : %d\n", arrString1, arrString2, nReturn1);
    printf("strcmp(%s, %s) return : %d\n", arrString1, arrString3, nReturn2);
    printf("strcmp(%s, %s) return : %d\n", arrString1, arrString4, nReturn3);
}
 
cs

 

10번째 줄은 "world!!"와 "worlc!!"를 비교합니다. "worl"까지는 같다가 'd'와 'c'가 다른데

'd'가 'c'가 아스키코드상의 10진수 상수로 봤을 때에는 68과 67이기 때문에 d가 더 큽니다.

매개변수 string1과 string2중에 string1이 더 크면 1이 리턴되기 때문에 strcmp(arrString1, arrString2)에서는 1이 리턴됩니다.

 

 

11번째 줄은 "world!!"와 "worlf!!"를 비교합니다. 여기도 "worl"까지는 같다가 'd'와 'f'가 다릅니다.

'd'와 'f'는 아스키코드상의 10진수 상수로 봤을 때, 68과 70이기 때문에 d가 작습니다.

매개변수 string1과 string2중에 string1이 더 작으면 -1이 리턴되기 때문에 strcmp(arrString1, arrString3)는 -1이 리턴됩니다.

 

 

12번째 줄은 두 값이 같기 때문에 0이 리턴됩니다.

 

 

strncmp

함수 원형
int strncmp( const char *string1, const char *string2, size_t count);

헤더 파일
string.h

설명
지정한 사이즈 만큼 두 문자열을 비교합니다.
string1과 string2 두 문자열을 count만큼 비교합니다.

리턴값
리턴값이 -1 일 때 -> 두 문자열을 count까지 비교하여, 틀린 첫번째 문자가 string1이 더 작을 때 -1을 리턴합니다.
리턴값이 0 일 때 -> 두 문자열이 count까지의 문자열이 같습니다.
리턴값이 1 일 때 -> 두 문자열을 count까지 비교하여, 틀린 첫번째 문자가 string1이 더 클 때 1을 리턴합니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
 
void main()
{
    char arrString1[20= "world!!";
    char arrString2[20= "worlc!!";
    char arrString3[20= "worlf!!";
    char arrString4[20= "worldd!!";
 
    int nReturn1 = strncmp(arrString1, arrString2, 5);
    int nReturn2 = strncmp(arrString1, arrString3, 5);
    int nReturn3 = strncmp(arrString1, arrString4, 5);
 
 
    printf("strncmp(%s, %s, 5) return : %d\n", arrString1, arrString2, nReturn1);
    printf("strncmp(%s, %s, 5) return : %d\n", arrString1, arrString3, nReturn2);
    printf("strncmp(%s, %s, 5) return : %d\n", arrString1, arrString4, nReturn3);
}
 
cs

11번째 줄(strncmp(arrString1, arrString2, 5))에서는 "world!!"와 "worlc!!"의 5개 문자까지 비교합니다.

그러므로 "!!"는 빠지고 "world"와 "worlc"만 비교하게 됩니다.

"worl"까지는 서로 같기 때문에 "d"와 "c"로 리턴 값이 결정되는데, 아스키 코드로 봤을 때는 'd'가 더 큰 값을 가집니다.

매개변수 string1과 string2중 string1의 값이 더크면 1을 리턴하게 되는데, 

strncmp(arrString1, arrString2, 5)에서는 arrString1값이 더 크기 때문에 1을 리턴하게 됩니다.

12번째 줄에서는 "world!!"와 "worlf!!"의 5개 문자까지 비교합니다.

그러므로 "!!"는 빠지고 "world"와 "worlf"만 비교하게 됩니다.

"worl"까지는 서로 같기 때문에 "d"와 "f"로 리턴 값이 결정되는데, 아스키 코드로 봤을 때는 'd'가 더 작은 값을 가집니다.

매개변수 string1과 string2중 string1의 값이 더 작으면 -1을 리턴하게 되는데, 

strncmp(arrString1, arrString3, 5)에서는 arrString1값이 더 작기 때문에 -1을 리턴하게 됩니다.

13번째 줄에서는 "world!!"와 "worldd!!"의 5개 문자까지 비교합니다.

문자열 전체로 봤을 때는 다른 문자열이지만, 5개 문자까지만 비교하기 때문에, 각각 "!!"와 "d!!"는 비교 대상에서 제외가 됩니다.

그러므로 둘은 똑같이 문자열로 비교되어 strncmp(arrString1, arrString4, 5)은 0이 리턴됩니다.

반응형

+ Recent posts