bsearch_s

Führt eine binäre Suche in einem sortierten eindimensionalen Arrays aus.Dies ist mit bsearch-Version (siehe unter Security Enhancements Sicherheitsfeatures im CRTbeschrieben.

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
    Das Objekt, nach dem gesucht werden soll.

  • base
    Zeiger auf die Basis für Suche von Daten.

  • num
    Anzahl von Elementen.

  • width
    Breite von Elementen.

  • compare
    Rückruffunktion, die zwei 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 auf den mit keyArrayelement verglichen werden soll.

  • context
    Ein Zeiger auf ein Objekt, das in der Vergleichsfunktion zugegriffen werden kann.

Rückgabewert

bsearch_s gibt einen Zeiger auf ein Vorkommen vonkey im Array zurück, das durch basedargestellt wird.Wenn key nicht gefunden wird, gibt die Funktion NULLzurück.Wenn das Array nicht in aufsteigender Sortierreihenfolge oder doppelte Datensätze mit identischem Schlüssel enthält, lautet das Ergebnis unvorhersehbar.

Wenn ungültige Parameter an die Funktion übergeben werden, wird der Ereignishandler aufgerufen, z. B. ungültige Parameter in Parametervalidierungbeschrieben.Wenn die Ausführung zulässig ist, um fortzufahren, wird errnozu EINVAL festgelegt, und die Funktion gibt NULLzurück.Weitere Informationen finden Sie unter errno, _doserrno, _sys_errlist und _sys_nerr.

Fehlerbedingungen

key

base

compare

num

width

errno

NULL

alle

alle

alle

alle

EINVAL

alle

NULL

alle

!= 0

alle

EINVAL

alle

alle

alle

alle

= 0

EINVAL

alle

alle

NULL

ein

alle

EINVAL

Hinweise

Die bsearch_s-Funktion führt eine binäre Suche eines sortierten eindimensionalen Arrays num-Elemente, die jeweils von Bytes an width Größe aus.Der base-Wert ist ein Zeiger auf der Basis des zu durchsuchenden Array, und key ist der Wert, der nicht gefunden wird.Der compare-Parameter ist ein Zeiger auf eine benutzerdefinierte Routine, die den angeforderten Schlüssel auf ein Arrayelement verglichen und einen der folgenden Werte zurück, die deren Beziehung angeben:

Wert von compare Routine zurückgegeben wird.

Beschreibung

< 0

Schlüssel ist kleiner als Arrayelement.

0

Schlüssel entspricht Arrayelement.

> 0

Schlüssel ist größer als Arrayelement.

Der context Zeiger ist möglicherweise nützlich, wenn die gesuchte Datenstruktur Teil eines Objekts ist und die Compare-Funktion Member des Objekts verweisen muss.Die compare-Funktion den void-Zeiger in den entsprechenden Objekttyp umwandeln können und auf Member dieses Objekts an.Die Einführung des context-Parameters ist sicherer, da bsearch_s zusätzlicher Kontext möglicherweise verwendet wird, um die Reentranz zu vermeiden, die mit der Verwendung von statischen Variablen, um Daten zur Verfügung zu stellen die compare-Funktion zugeordnet sind.

Anforderungen

Routine

Erforderlicher Header

bsearch_s

<stdlib.h> und <search.h>

Um Kompatibilität zusätzlichen Informationen finden Sie unter Kompatibilität in der Einführung.

Beispiel

Dieses Programm sortiert ein Zeichenfolgenarray mit qsort_sund 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