NAME

strverscmp - 두 버전 문자열 비교하기

SYNOPSIS

#define _GNU_SOURCE         /* feature_test_macros(7) 참고 */
#include <string.h>

int strverscmp(const char *s1, const char *s2);

DESCRIPTION

jan1, jan2, ..., jan9, jan10, ... 이런 파일들이 있는데 ls(1) 하면 순서가 jan1, jan10, ..., jan2, ..., jan9 식으로 나오는 게 이상해 보일 때가 종종 있다. 이걸 바로잡기 위해 GNU에서 ls(1)-v 옵션을 도입했는데, 그 구현에서 versionsort(3)를 사용하며 다시 거기서 strverscmp()를 사용한다.

인즉 strcmp(3)가 사전적 순서만 찾는 반면 strverscmp()가 하는 일은 두 문자열을 비교하여 "올바른" 순서를 찾는 것이다. 이 함수는 로캘 범주 LC_COLLATE를 사용하지 않는다. 따라서 기본적으로 문자열이 ASCII일 것으로 예상되는 상황들을 위한 것이다.

이 함수가 하는 일은 이렇다. 두 문자열이 같으면 0을 반환한다. 그렇지 않으면 앞에서는 두 문자열이 같고 거기부터는 다른 위치를 찾는다. 그리고 그 위치를 포함하는 (거기서 시작하거나 끝날 수도 있는) 가장 긴 연속된 숫자 열을 찾는다. 양쪽 모두나 어느 한쪽에서 이 열이 비어 있으면 strcmp(3)가 반환할 결과를 반환한다 (바이트 값의 크기에 따라 정렬). 그렇지 않으면 두 숫자 열을 수로서 비교한다. 이때 선두에 0이 한 개 이상 있으면 그 앞에 소수점이 있는 것처럼 해석한다. (그래서 특히 선두에 0이 더 많은 숫자 열이 선두에 0이 더 적은 숫자 열 앞에 오도록 한다.) 그리하여 000, 00, 01, 010, 09, 0, 1, 9, 10 순서가 된다.

RETURN VALUE

strverscmp() 함수는 s1s2보다 앞이거나, 같거나, 뒤인 경우에 각각 0보다 작거나, 같거나, 큰 정수를 반환한다.

ATTRIBUTES

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

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

CONFORMING TO

이 함수는 GNU 확장이다.

EXAMPLES

아래 프로그램을 이용해 strverscmp()의 동작 방식을 볼 수 있다. strverscmp()를 사용해 명령행 인자로 받은 두 문자열을 비교한다. 용례는 다음과 같다.

$ ./a.out jan1 jan10
jan1 < jan10

프로그램 소스

#define _GNU_SOURCE
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

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

    if (argc != 3) {
        fprintf(stderr, "Usage: %s <string1> <string2>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    res = strverscmp(argv[1], argv[2]);

    printf("%s %s %s\n", argv[1],
            (res < 0) ? "<" : (res == 0) ? "==" : ">", argv[2]);

    exit(EXIT_SUCCESS);
}

SEE ALSO

rename(1), strcasecmp(3), strcmp(3), strcoll(3)


2021-03-22