bsearch

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Stdlib.h - Index


Header-Datei

stdlib.h

Kategorie

Routinen für Speicher- und String-Bearbeitung

Prototyp

void *bsearch(const void *key, const void *base, size_t nelem, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));

Beschreibung

Binärsuche in einem Array.

bsearch durchsucht eine Tabelle (ein Array) mit nelem Elementen und gibt die Adresse des ersten mit dem Suchschlüssel übereinstimmenden Elements zurück. Das Array muss sortiert sein. Wird keine Übereinstimmung gefunden, gibt bsearch 0 zurück.

Hinweis: Da eine Binärsuche durchgeführt wird, muss der erste übereinstimmende Eintrag nicht notwendigerweise auch der erste Eintrag der Tabelle sein.

Der Typ size_t ist in der Header-Datei stddef.h definiert.

  • Der Parameter nelem gibt die Anzahl der Elemente in der Tabelle an.
  • width gibt in Bytes die Größe jedes Tabelleneintrags an.

Die Vergleichsroutine fcmp muss mit der Aufrufkonvention _USERENTRY deklariert werden.

fcmp wird mit zwei Argumenten aufgerufen: elem1 und elem2. Jedes Argument zeigt auf eines der beiden zu vergleichenden Elemente. Die Vergleichsfunktion vergleicht die beiden Einträge, auf die *elem1 und *elem2 zeigen, und gibt einen vom Ergebnis dieses Vergleichs abhängigen Integerwert zurück.

  • Für bsearch ist der Rückagbewert von fcmp
  • < 0, wenn *elem1 < *elem2 ist;
  • == 0, wenn *elem1 == *elem2 ist;
  • > 0, wenn *elem1 > *elem2 ist.

Rückgabewert

bsearch gibt die Adresse des ersten Eintrags in der Tabelle zurück, der mit dem Suchschlüssel übereinstimmt. Wird keine Übereinstimmung gefunden, gibt bsearch 0 zurück.

Beispiel

 #include <stdlib.h>
 #include <stdio.h>
 typedef int (*fptr)(const void*, const void*);
 #define NELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
 int numarray[] = {123, 145, 512, 627, 800, 933};
 int numeric (const int *p1, const int *p2)
 {
    return(*p1 - *p2);
 }
 #pragma argsused
 int lookup(int key)
 {
    int  *itemptr;
    /* Die Typumwandlung (int(*)(const void *,const void*))
       ist notwendig, um zum Zeitpunkt der Compilierung
       einen Fehler wegen eines falschen Typs zu vermeiden */
    itemptr = (int *) bsearch (&key, numarray, NELEMS(numarray),
       sizeof(int), (fptr)numeric);
    return (itemptr != NULL);
 }
 int main(void)
 {
    if (lookup(512))
       printf("512 is in the table.\n");
    else
       printf("512 isn't in the table.\n");
    return 0;
 }

Portabilität

POSIX Win32 ANSI C ANSI C++

+

+

+

+