bsearch(3) binarne przeszukiwanie posortowanej tablicy

SKŁADNIA

#include <stdlib.h>


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

OPIS

Funkcja bsearch() przeszukuje tablicę obiektów nmemb, której pierwszy element jest wskazywany przez base, w poszukiwaniu elementu pasującego do obiektu wskazywanego przez key. Rozmiar każdego z elementów tablicy określony jest przez size.

Zawartość tablicy powinna być posortowana w kolejności rosnącej zgodnie z funkcją porównawczą wskazywaną przez compar. Funkcja compar powinna przyjmować dwa argumenty: wskaźnik do obiektu key oraz do elementu tablicy i powinna zwracać liczbę całkowitą mniejszą od zera, równą zeru lub większą niż zero, jeśli obiekt key okazał się, odpowiednio, mniejszy, równy lub większy niż element tablicy.

WARTOŚĆ ZWRACANA

Funkcja bsearch() zwraca wskaźnik do pasującego elementu tablicy lub NULL, jeśli nie znaleziono takiego elementu. Jeśli istnieje więcej takich elementów, to nie jest określone, na który element będzie wskazywać zwrócony wskaźnik.

ZGODNE Z

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

PRZYKŁAD

Poniższe przykład najpierw sortuje tablicę struktur, używając qsort(3), a następnie pobiera żądane elementy, używając bsearch().

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct mi {
    int nr;
    char *name;
} months[] = {
    { 1, "sty" }, { 2, "lut" }, { 3, "mar" }, { 4, "kwi" },
    { 5, "maj" }, { 6, "cze" }, { 7, "lip" }, { 8, "sie" },
    { 9, "wrz" }, {10, "paź" }, {11, "lis" }, {12, "gru" }
};
#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': nieznany miesiąc\n", argv[i]);
        else
            printf("%s: miesiąc #%d\n", res->name, res->nr);
    }
    exit(EXIT_SUCCESS);
}

O STRONIE

Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Adam Byrtek (PTM) <[email protected]>, Andrzej Krzysztofowicz (PTM) <[email protected]> i Robert Luberda <[email protected]>.

Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 3.71 oryginału.