Freigeben über


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" );
}
  

.NET Framework-Entsprechung

BinarySearch

Siehe auch

Referenz

Suchen und Sortieren

_lfind

_lsearch

qsort