НАЗВА

bsearch - бінарний пошук сортованого масиву

ОГЛЯД

 **#include <stdlib.h>** 

 **void *bsearch(const void ***_key_**, 
         const void ***_base_**, size_t **_nmemb_**,** **size_t **_size_**, 
         int (***_compar_**)(const void *, const void *));**

ОПИС

Функція bsearch() здійснює пошук по масиву з nmemb об'єктами, base вказуючи на початковий елемент мсиву, на предмет елементу, що співпадає з об'єктом, на який вказує key. Розмір елеметів масиву вказується через size.

Вміст масиву повинен знаходитись у зростаючій сортованій послідовності, згідно з функцією порівнювання, на яку посилається compar. Функція порівнювання, вказана compar очікується, що матиме два аргументи, що показують на ключовий об'єкт і на елемент масиву, саме в цій послідовності і повинна повертати ціле менше, рівне або більше нуля, якщо ключовий об'єкт є, відповідно, меншим за, рівним або більшим за елемент масиву.

ПОВЕРНЕНІ ЗНАЧЕННЯ

Функція bsearch() повертає покажчик на співпадаючий елемент масиву або NULL, якщо співпадання не відбулося. Якщо існує декілька елементів, що співпадають із key, повернений елемент не буде вказано.

ПРИКЛАД

Приклад нижче спочатку сортує масив, використовуючи ?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) {
        struct mi *mi1 = (struct mi *) m1;
        struct mi *mi2 = (struct mi *) m2;
        return strcmp(mi1->name, mi2->name);
    }

    int main(int argc, char **argv) {
         int i;

         qsort(months, nr_of_months, sizeof(struct mi), compmi);
         for (i = 1; i < argc; i++) {
             struct mi key, *res;
             key.name = argv[i];
             res = bsearch(&key, months, nr_of_months,
                 sizeof(struct mi), compmi);
             if (res == NULL)
                 printf("'%s': unknown month\n", argv[i]);
             else
                 printf("%s: month #%d\n", res->name, res->nr);
        }
        return 0;
    }

ВІДПОВІДНІСТЬ СТАНДАРТАМ

SVID 3, BSD 4.3, ISO 9899 (C99)

ДИВІТЬСЯ ТАКОЖ

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