strcmp, strncmp 문자열 비교


strcmp, strncmp 문자열 비교


문자열 비교에 대해서 알아보겠다.

문자열 비교 함수에는 strcmp, strncmp 함수가 있다 이 함수들을 사용하려면 string.h 파일을 include 해야 된다.

strcmp 함수의 반환값에 대해서 먼저 알아보자. strcmp는 ASCII 코드로 비교한다.

strcmp("aos", "super"); | strncmp("aos", "super", 3)이라고 했을 때,


첫 번째 인자가 더 크면 양수를 반환하고

두 번째 인자가 더 크면 음수를 반환하고

내용이 같으면 0을 반환한다.

strncmp는 마지막 인자 값이 원하는 데이터만큼만 비교를 한다.


소스를 보면서 이해를 하자.


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>
main()
{
    char str1[20], str2[20];
    int a;
    printf("입력 : ");
    scanf_s("%s", str1, sizeof(str1));
    printf("입력 : ");
    scanf_s("%s", str2, sizeof(str2));
 
    a = strcmp(str1, str2);
    if (a == 0)
        printf("문자열이 같습니다.\n");
    else if (a > 0)
        printf("첫번째 문자가 더 큼니다.\n");
    else
        printf("두번째 문자가 더 큼니다.\n");
}
cs

< 출력 >
입력 : aos
입력 : super
두번째 문자가 더 큼니다.

입력 : super
입력 : aos
첫번째 문자가 더 큼니다.

입력 : aos
입력 : aos
문자열이 같습니다.

strcmp(str1, str2) 반환값을 변수 a에 넣어준 이유는 if 문마다 strcmp를 넣어서 계속 비교하면 속도가 느릴 것이다.
그래서 변수 a에 반환값을 넣어주고 반환값으로 비교를 했다.
문자열이 같으면 0, 첫 번째가 크면 양수, 두 번째가 크면 음수를 반환하게 되어있다.
strncmp는 안 해봐도 알 것이다. 

그렇다면 strcmp가 어떻게 동작을 하는지 한번 strcmp의 원형을 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
char cpy(const char *str1, const char *str2)
{
    while (*str1) {
        if (*str1 != *str2)
            break;
        str1++, str2++;
    }
    return (*str1 - *str2);
}
main()
{
    char str1[20], str2[20];
    int a;
    printf("입력 : ");
    scanf_s("%s", str1, sizeof(str1));
    printf("입력 : ");
    scanf_s("%s", str2, sizeof(str2));
 
    a = cpy(str1, str2);
    if (a == 0)
        printf("문자열이 같습니다.\n");
    else if (a > 0)
        printf("첫번째 문자가 더 큼니다.\n");
    else
        printf("두번째 문자가 더 큼니다.\n");
    printf("%d", a);
}
cs

< 출력 >
입력 : a
입력 : a
문자열이 같습니다.
0

입력 : a
입력 : b
두번째 문자가 더 큼니다.
-1

입력 : b
입력 : a
첫번째 문자가 더 큼니다.
1


결과는 이렇게 나온다.


그럼 strncmp 원형을 알아보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
char cpy(const char *str1, const char *str2, int num)
{
    while (*str1) {
        if (*str1 != *str2 && *str1 == num)
            break;
        str1++, str2++;
    }
    return (*str1 - *str2);
}
main()
{
    char str1[20], str2[20];
    int a;
    printf("입력 : ");
    scanf_s("%s", str1, sizeof(str1));
    printf("입력 : ");
    scanf_s("%s", str2, sizeof(str2));
 
    a = cpy(str1, str2, 3);
    if (a == 0)
        printf("문자열이 같습니다.\n");
    else if (a > 0)
        printf("첫번째 문자가 더 큼니다.\n");
    else
        printf("두번째 문자가 더 큼니다.\n");
    printf("%d", a);
}
cs

< 출력 >
입력 : abc
입력 : ab
첫번째 문자가 더 큼니다.
2

입력 : abc
출력 : abcd
두번째 문자가 더 큼니다.
-100

입력 : abc
입력 : abc
문자열이 같습니다.
0

결과가 이렇게 나온다

댓글

Designed by JB FACTORY