NAME

strcmp, strncmp - 두 문자열 비교하기

SYNOPSIS

#include <string.h>

int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);

DESCRIPTION

strcmp() 함수는 두 문자열 s1s2를 비교한다. 로캘을 고려하지 않는다. (로캘에 근거한 비교는 strcoll(3)을 보라.) 부호 없는 문자로 비교를 한다.

strcmp()는 비교 결과를 나타내는 정수를 반환한다.

strncmp()는 이와 비슷하되, s1s2의 처음 (최대) n 바이트만 비교한다.

RETURN VALUE

strcmp()strncmp() 함수는 s1이 (또는 그 처음 n 바이트가) s2보다 작거나, 일치하거나, 큰 경우에 0보다 작거나, 같거나, 큰 정수를 반환한다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
strcmp(), strncmp() 스레드 안전성 MT-Safe

CONFORMING TO

POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

NOTES

POSIX.1에서는 다음처럼만 명세하고 있다.

0 아닌 반환 값의 부호는 비교 대상 문자열들에서 첫 번째로 다른 (unsigned char 타입으로 해석한) 바이트 쌍의 값 차이의 부호에 의해 정해진다.

glibc에서는 다른 여러 구현체들과 마찬가지로 마지막으로 비교한 s1의 바이트에서 마지막으로 비교한 s2의 바이트를 뺀 산술 결과 값이 반환 값이다. (두 문자가 같은 경우에는 차이가 0이다.)

EXAMPLES

아래 프로그램을 사용해 (인자가 2개일 때) strcmp()와 (인자가 3개일 때) strncmp()의 동작을 볼 수 있다. 다음은 strcmp()를 쓰는 예시다.

$ ./string_comp ABC ABC
<str1> and <str2> are equal
$ ./string_comp ABC AB      # 'C'는 ASCII 67, 'C' - ' ' = 67
<str1> is greater than <str2> (67)
$ ./string_comp ABA ABZ     # 'A'는 ASCII 65, 'Z'는 ASCII 90
<str1> is less than <str2> (-25)
$ ./string_comp ABJ ABC
<str1> is greater than <str2> (7)
$ ./string_comp $'\201' A   # 0201 - 0101 = 0100 (십진수 64)
<str1> is greater than <str2> (64)

위 예에서 8비트 ASCII 코드를 담은 문자열을 만들어 내기 위해 bash(1) 전용 문법을 쓴다. 결과를 보면 문자열 비교에 부호 없는 문자를 쓰는 걸 알 수 있다.

다음은 strncmp()를 쓰는 예시다.

$ ./string_comp ABC AB 3
<str1> is greater than <str2> (67)
$ ./string_comp ABC AB 2
<str1> and <str2> are equal in the first 2 bytes

프로그램 소스

/* string_comp.c

   Licensed under GNU General Public License v2 or later.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(int argc, char *argv[])
{
    int res;

    if (argc < 3) {
        fprintf(stderr, "Usage: %s <str1> <str2> [<len>]\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    if (argc == 3)
        res = strcmp(argv[1], argv[2]);
    else
        res = strncmp(argv[1], argv[2], atoi(argv[3]));

    if (res == 0) {
        printf("<str1> and <str2> are equal");
        if (argc > 3)
            printf(" in the first %d bytes\n", atoi(argv[3]));
        printf("\n");
    } else if (res < 0) {
        printf("<str1> is less than <str2> (%d)\n", res);
    } else {
        printf("<str1> is greater than <str2> (%d)\n", res);
    }

    exit(EXIT_SUCCESS);
}

SEE ALSO

bcmp(3), memcmp(3), strcasecmp(3), strcoll(3), string(3), strncasecmp(3), strverscmp(3), wcscmp(3), wcsncmp(3), ascii(7)


2021-03-22