NAME

bsearch - 정렬된 배열 이진 탐색

SYNOPSIS

#include <stdlib.h>

void *bsearch(const void *key, const void *base,
              size_t nmemb, size_t size,
              int (*compar)(const void *, const void *));

DESCRIPTION

bsearch() 함수는 base가 첫 항목을 가리키는 nmemb 개 객체의 배열에서 key가 가리키는 객체와 일치하는 항목을 탐색한다. 배열 항목의 크기를 size로 지정한다.

compar가 가리키는 비교 함수에 따라서 배열 내용물이 오름차순으로 정렬돼 있어야 한다. compar 루틴에는 두 인자가 있어서 차례로 key 객체와 배열 항목을 가리키게 돼 있으며, key 객체가 배열 항목보다 작거나 같거나 클 때 각각 0보다 작거나 같거나 큰 정수를 반환해야 한다.

RETURN VALUE

bsearch() 함수는 일치하는 배열 항목에 대한 포인터를 반환하며 일치 항목이 없으면 NULL을 반환한다. 키에 일치하는 항목이 여러 개 있는 경우 어느 항목을 반환하는지는 명세돼 있지 않다.

ATTRIBUTES

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

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

CONFORMING TO

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

EXAMPLES

아래 예에서는 먼저 qsort(3)를 써서 구조체 배열을 정렬하고 bsearch()를 써서 원하는 항목을 얻는다.

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

struct mi {
    int nr;
    char *name;
} months[] = {
    { 1, "jan" }, { 2, "feb" }, { 3, "mar" }, { 4, "apr" },
    { 5, "may" }, { 6, "jun" }, { 7, "jul" }, { 8, "aug" },
    { 9, "sep" }, {10, "oct" }, {11, "nov" }, {12, "dec" }
};

#define nr_of_months (sizeof(months)/sizeof(months[0]))

static int
compmi(const void *m1, const void *m2)
{
    const struct mi *mi1 = m1;
    const struct mi *mi2 = m2;
    return strcmp(mi1->name, mi2->name);
}

int
main(int argc, char **argv)
{
    qsort(months, nr_of_months, sizeof(months[0]), compmi);
    for (int i = 1; i < argc; i++) {
        struct mi key;
        struct mi *res;

        key.name = argv[i];
        res = bsearch(&key, months, nr_of_months,
                      sizeof(months[0]), compmi);
        if (ret == NULL)
            printf("'%s': unknown month\n", argv[i]);
        else
            printf("%s: month #%d\n", res->name, res->nr);
    }
    exit(EXIT_SUCCESS);
}

SEE ALSO

hsearch(3), lsearch(3), qsort(3), tsearch(3)


2021-03-22