bsearch, bsearch_s
|
Definiert in Header
<stdlib.h>
|
||
| (1) | ||
|
void
*
bsearch_s
(
const
void
*
key,
const
void
*
ptr, rsize_t count, rsize_t size,
int
(
*
comp
)
(
const
void
*
,
const
void
*
,
void
*
)
,
|
(2) | (seit C11) |
| (3) | (seit C23) | |
|
/*QVoid*/
*
bsearch_s
(
const
void
*
key,
/*QVoid*/
*
ptr, rsize_t count, rsize_t size,
int
(
*
comp
)
(
const
void
*
,
const
void
*
,
void
*
)
,
|
(4) | (seit C23) |
key
referenzierten Element entspricht, in einem Array, auf das
ptr
zeigt. Das Array enthält
count
Elemente von je
size
Bytes und muss bezüglich
key
partitioniert sein, d.h. alle Elemente, die kleiner vergleichen, müssen vor allen Elementen erscheinen, die gleich vergleichen, und diese müssen vor allen Elementen erscheinen, die größer vergleichen als das Schlüsselobjekt. Ein vollständig sortiertes Array erfüllt diese Anforderungen. Die Elemente werden mittels der durch
comp
referenzierten Funktion verglichen. Das Verhalten ist undefiniert, wenn das Array nicht bereits bezüglich
*key
in aufsteigender Reihenfolge gemäß demselben Kriterium partitioniert ist, das
comp
verwendet.
context
an
comp
übergeben wird und dass die folgenden Fehler zur Laufzeit erkannt werden und die aktuell installierte
Constraint-Handler
-Funktion aufrufen:
-
-
countodersizegrößer als RSIZE_MAX sind -
key,ptrodercompein Nullzeiger sind (soferncountnicht null ist)
-
-
Wie bei allen bounds-checked-Funktionen ist
bsearch_s(und das entsprechende typgenerische Makro) (seit C23) nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf die Integer-Konstante 1 setzt, bevor <stdlib.h> eingebunden wird.
T
ein unqualifizierter Objekttyp (einschließlich
void
).
-
-
Wenn
ptrvom Typ const T * ist, dann ist der Rückgabetyp const void * . -
Andernfalls, wenn
ptrvom Typ T * ist, dann ist der Rückgabetyp void * . - Andernfalls ist das Verhalten undefiniert.
-
Wenn
Wenn das Array mehrere Elemente enthält, die
comp
als gleich dem gesuchten Element anzeigen würde, dann ist nicht spezifiziert, welches Element die Funktion als Ergebnis zurückgibt.
|
Direkte Verwendungen der tatsächlichen Funktionen (1) und (2) sind veraltet. |
(since C23) |
Inhaltsverzeichnis |
Parameter
| key | - | Zeiger auf das zu suchende Element |
| ptr | - | Zeiger auf das zu untersuchende Array |
| count | - | Anzahl der Elemente im Array |
| size | - | Größe jedes Elements im Array in Bytes |
| comp | - |
Vergleichsfunktion, die eine negative Ganzzahl zurückgibt, wenn das erste Argument
kleiner
als das zweite ist, eine positive Ganzzahl, wenn das erste Argument
größer
als das zweite ist, und null, wenn die Argumente äquivalent sind.
key
wird als erstes Argument übergeben, ein Element aus dem Array als zweites.
Die Signatur der Vergleichsfunktion sollte der folgenden entsprechen: int cmp ( const void * a, const void * b ) ; Die Funktion darf die übergebenen Objekte nicht modifizieren und muss bei Aufruf für dieselben Objekte konsistente Ergebnisse zurückgeben, unabhängig von deren Position im Array. |
| context | - |
Zustand des Komparators (z.B. Sortierreihenfolge), der an
comp
als drittes Argument übergeben wird
|
Rückgabewert
Hinweise
Trotz des Namens verlangen weder die C- noch die POSIX-Standards, dass diese Funktion mittels binärer Suche implementiert wird oder geben irgendwelche Komplexitätsgarantien.
Im Gegensatz zu anderen grenzprüfenden Funktionen
behandelt
bsearch_s
Arrays mit der Größe Null nicht als Laufzeitbedingungsverletzung
und gibt stattdessen "Element nicht gefunden" zurück
(die andere Funktion, die Arrays mit der Größe Null akzeptiert, ist
qsort_s
).
Bis
bsearch_s
verwendeten Benutzer von
bsearch
häufig globale Variablen, um den Zustand des Komparators darzustellen.
Beispiel
#include <stdlib.h> #include <stdio.h> struct data { int nr; char const *value; } dat[] = { {1, "Foo"}, {2, "Bar"}, {3, "Hello"}, {4, "World"} }; int data_cmp(void const *lhs, void const *rhs) { struct data const *const l = lhs; struct data const *const r = rhs; if (l->nr < r->nr) return -1; else if (l->nr > r->nr) return 1; else return 0; // return (l->nr > r->nr) - (l->nr < r->nr); // possible shortcut // return l->nr - r->nr; // erroneous shortcut (fails if INT_MIN is present) } int main(void) { struct data key = { .nr = 3 }; struct data const *res = bsearch(&key, dat, sizeof dat / sizeof dat[0], sizeof dat[0], data_cmp); if (res) { printf("No %d: %s\n", res->nr, res->value); } else { printf("No %d not found\n", key.nr); } }
Ausgabe:
No 3: Hello
Referenzen
- C17-Standard (ISO/IEC 9899:2018):
-
- 7.22.5.1 Die bsearch-Funktion (S: 258)
-
- K.3.6.3.1 Die bsearch_s-Funktion (S: 441-442)
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.22.5.1 Die bsearch-Funktion (S. 355)
-
- K.3.6.3.1 Die bsearch_s-Funktion (S. 608-609)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.20.5.1 Die bsearch-Funktion (S. 318-319)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 4.10.5.1 Die bsearch-Funktion
Siehe auch
|
(C11)
|
sortiert eine Reihe von Elementen mit unspezifiziertem Typ
(Funktion) |
|
C++-Dokumentation
für
bsearch
|
|