Condividi tramite


bsearch_s

esegue una ricerca binaria di una matrice ordinata.Si tratta di versione di bsearch con i miglioramenti della sicurezza come descritto in Funzionalità di sicurezza in CRT.

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

Parametri

  • key
    oggetto da cercare.

  • base
    Puntatore alla base dei dati trovati.

  • num
    Numero di elementi.

  • width
    Larghezza degli elementi.

  • compare
    funzione di callback che confronta due elementi.il primo argomento è context puntatore.Il secondo argomento è un puntatore a key per la ricerca.Il terzo argomento è un puntatore all'elemento di matrice da confrontare con un oggetto key.

  • context
    Un puntatore a un oggetto accessibile nella funzione di confronto.

Valore restituito

bsearch_s restituisce un puntatore a un'occorrenzakey nella matrice indicata da base.se key non viene trovato, la funzione restituisce NULL.Se la matrice non è di dimensioni o non contiene record duplicati con chiavi identiche, il risultato sarà imprevedibile.

Se i parametri non validi vengono passati alla funzione, il gestore non valido di parametro viene richiamato come descritto in Convalida dei parametri.Se l'esecuzione è consentita per continuare, errnoè impostato su EINVAL e restituisce un valore di funzione NULL.Per ulteriori informazioni, vedere errno, _doserrno, _sys_errlist e _sys_nerr.

condizioni di errore

key

base

compare

num

width

errno

NULL

qualsiasi

qualsiasi

qualsiasi

qualsiasi

EINVAL

qualsiasi

NULL

qualsiasi

!= 0

qualsiasi

EINVAL

qualsiasi

qualsiasi

qualsiasi

qualsiasi

= 0

EINVAL

qualsiasi

qualsiasi

NULL

an

qualsiasi

EINVAL

Note

bsearch_s la funzione esegue una ricerca binaria di una matrice ordinata di num elementi, ognuno di width byte nella dimensione.base il valore è un puntatore alla base della matrice da cercare e key è il valore da cercare.compare il parametro è un puntatore a una routine fornita dall'utente che confronta la chiave richiesta a un elemento di matrice e restituisce uno dei seguenti valori che specificano la loro relazione:

Valore restituito da compare routine

Descrizione

< 0

La chiave è minore dell'elemento della matrice.

0

La chiave è uguale all'elemento della matrice.

> 0

La chiave è maggiore dell'elemento della matrice.

context il puntatore può essere utile se la struttura di dati trovata fa parte di un oggetto e la funzione di confronto deve accedere ai relativi membri.compare la funzione possibile eseguire il cast del puntatore a void nel tipo di oggetto appropriato e i membri di accesso dell'oggetto.L'aggiunta di context il parametro fa bsearch_s maggiore sicurezza poiché il contesto aggiuntivo può essere utilizzato per evitare dei bug con una reentrancy associati all'utilizzo delle variabili statiche per rendere i dati di compare funzione.

Requisiti

routine

Intestazione di associazione

bsearch_s

<definito> e <search.h>

per informazioni di compatibilità aggiuntive, vedere Compatibilità nell'introduzione.

Esempio

questo programma ordina una matrice di stringhe con qsort_squindi utilizza i bsearch_s per trovare la parola “gatto„.

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

Equivalente .NET Framework

BinarySearch

Vedere anche

Riferimenti

Ricerca e ordinamento

_lfind

_lsearch

qsort