BSEARCH(3)

BEZEICHNUNG
bsearch - Binäre Suche in einem sortierten Array

ÜBERSICHT
#include <stdlib.h>

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

BESCHREIBUNG
bsearch() durchsucht ein Array mit einer Anzahl von nmemb Elementen, auf dessen erstes Element base zeigt, nach einem Element, das mit dem Objekt übereinstimmt, auf das key zeigt. Die Größe der einzelnen Elemente des Arrays ist durch size festgelegt.

Der Inhalt des Arrays sollte gemäß der Vergleichsfunktion, auf die compar verweist, aufsteigend sortiert sein. Die Funktion compar muss zwei Argumente entgegennehmen. Das erste Argument verweist auf key und das zweite auf ein Arrayelement. Der Rückgabewert sollte ein Integer sein, der kleiner, gleich oder größer Null ist, falls das key-Objekt kleiner, gleich oder größer als das Arrayelement ist.

RÜCKGABEWERT
Die Funktion bsearch() gibt einen Zeiger auf ein passendes Arrayelement zurück, oder NULL wenn keine Übereinstimmung gefunden wurde. Gibt es mehrere Elemente die auf key passen, ist das zurückgegebene Element nicht spezifiziert.

BEISPIEL
Das folgende Beispiel sortiert zuerst ein Array von Strukturen mittels qsort(3), und sucht dann nach dem gewünschten Element mit 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;
}

KONFORM ZU
SVID 3, 4.3BSD, ISO 9899 (C99)

SIEHE AUCH
hsearch(3), lsearch(3), qsort(3), tsearch(3).