bsearch_s
Führt eine binäre Suche eines sortierte Arrays aus. Dies ist Version von bsearch mit werden, wie in Sicherheitsfunktionen in der CRT beschrieben.
void *bsearch_s(
const void *key,
const void *base,
size_t num,
size_t width,
int ( __cdecl *compare ) ( void *, const void *key, const void *datum),
void * context
);
Parameter
key
Planen Sie für Suche für ein.base
Zeiger zur Basis von Suchendaten.num
Anzahl der Elemente.width
Breite von Elementen.compare
Rückruffunktion, die beiden Elemente verglichen. Das erste Argument ist der context Zeiger. Das zweite Argument ist ein Zeiger auf key für die Suche. Das dritte Argument ist ein Zeiger mit key verglichen werden Arrayelement.context
Ein Zeiger auf ein Objekt, auf das in der Vergleichsfunktion zugegriffen werden kann.
Rückgabewert
bsearch_s gibt einen Zeiger auf ein Vorkommen von key im Array zurück, das auf den durch base gezeigt wird. Wenn key nicht gefunden wird, wird NULL zurückgegeben. Wenn das Array nicht in aufsteigender Sortierreihenfolge ist oder doppelte Datensätze mit identischen Schlüssel enthält, ist das Ergebnis unvorhersehbar.
Wenn ungültige Parameter an die Funktion übergeben werden, wird der ungültige Parameterhandler aufgerufen, wie in Parametervalidierung beschrieben. Wenn die Ausführung zulässig ist, um fortzufahren, wird errno auf EINVAL festgelegt und die Funktion gibt NULL zurück. Weitere Informationen finden Sie unter errno, _doserrno, _sys_errlist und _sys_nerr.
Fehlerbedingungen
key |
base |
compare |
num |
width |
errno |
NULL |
any |
any |
any |
any |
EINVAL |
any |
NULL |
any |
!= 0 |
any |
EINVAL |
any |
any |
any |
any |
= 0 |
EINVAL |
any |
any |
NULL |
an |
any |
EINVAL |
Hinweise
Die bsearch_s-Funktion führt eine binäre Suche eines sortierte Arrays num-Elemente, jedes von width Bytes an Größe aus. Der Wert base ist ein Zeiger zur Basis des zu durchsuchenden Arrays, und key ist der Wert, der gefunden wird. Der Parameter compare ist ein Zeiger auf eine vom Benutzer bereitgestellten Routine, die die angeforderten Schlüssel einem Arrayelement vergleicht und einen der folgenden Werte zurückgibt, die ihrer Beziehung eingeben:
Wert zurückgegeben durch compare Routine |
Beschreibung |
---|---|
< 0 |
Schlüssel ist kleiner als Arrayelement. |
0 |
Schlüssel entspricht Arrayelement. |
> 0 |
Schlüssel ist größer Arrayelement. |
Der context Zeiger ist möglicherweise nützlich, wenn die gesuchte Datenstruktur Teil eines Objekts ist und die Compare-Funktion Member des Objekts zugreifen muss. Die compare-Funktion den void-Zeiger in die entsprechenden Objekttypen aufgelistet umwandeln und darf auf Member dieses Objekts an. Die Einführung des Parameters context macht bsearch_s sicherer, da zusätzliche Kontext möglicherweise verwendet wird, um die Reentranzfehler zu vermeiden, die mithilfe von statischen Variablen, um Daten zur Verfügung stehen die compare-Funktion zugeordnet sind.
Anforderungen
Routine |
Erforderlicher Header |
---|---|
bsearch_s |
<stdlib.h und> search.h <> |
Um zusätzliche Kompatibilitätsinformation finden Sie unter Kompatibilität in der Einführung.
Beispiel
Dieses Programm sortiert ein Zeichenfolgenarray mit qsort_s und verwendet dann bsearch_s, um das Wort "Katze" zu suchen.
// crt_bsearch_s.cpp
// This program uses bsearch_s to search a string array,
// passing a locale as the context.
// compile with: /EHsc
#include <stdlib.h>
#include <stdio.h>
#include <search.h>
#include <process.h>
#include <locale.h>
#include <locale>
#include <windows.h>
using namespace std;
// The sort order is dependent on the code page. Use 'chcp' at the
// command line to change the codepage. When executing this application,
// the command prompt codepage must match the codepage used here:
#define CODEPAGE_850
#ifdef CODEPAGE_850
#define ENGLISH_LOCALE "English_US.850"
#endif
#ifdef CODEPAGE_1252
#define ENGLISH_LOCALE "English_US.1252"
#endif
// The context parameter lets you create a more generic compare.
// Without this parameter, you would have stored the locale in a
// static variable, thus making it vulnerable to thread conflicts
// (if this were a multithreaded program).
int compare( void *pvlocale, char **str1, char **str2)
{
char *s1 = *str1;
char *s2 = *str2;
locale& loc = *( reinterpret_cast< locale * > ( pvlocale));
return use_facet< collate<char> >(loc).compare(
s1, s1+strlen(s1),
s2, s2+strlen(s2) );
}
int main( void )
{
char *arr[] = {"dog", "pig", "horse", "cat", "human", "rat", "cow", "goat"};
char *key = "cat";
char **result;
int i;
/* Sort using Quicksort algorithm: */
qsort_s( arr,
sizeof(arr)/sizeof(arr[0]),
sizeof( char * ),
(int (*)(void*, const void*, const void*))compare,
&locale(ENGLISH_LOCALE) );
for( i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i ) /* Output sorted list */
printf( "%s ", arr[i] );
/* Find the word "cat" using a binary search algorithm: */
result = (char **)bsearch_s( &key,
arr,
sizeof(arr)/sizeof(arr[0]),
sizeof( char * ),
(int (*)(void*, const void*, const void*))compare,
&locale(ENGLISH_LOCALE) );
if( result )
printf( "\n%s found at %Fp\n", *result, result );
else
printf( "\nCat not found!\n" );
}