Condividi tramite


bsearch_s

Esegue una ricerca binaria di una matrice ordinata. Questa funzione è una versione di con miglioramenti della bsearch sicurezza, come descritto in Funzionalità di sicurezza in CRT.

Sintassi

void *bsearch_s(
   const void *key,
   const void *base,
   size_t number,
   size_t width,
   int ( __cdecl *compare ) ( void *, const void *key, const void *datum),
   void * context
);

Parametri

key
Puntatore alla chiave da cercare.

base
Puntatore alla base dei dati di ricerca.

number
Numero di elementi.

width
Larghezza degli elementi.

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

context
Puntatore a un oggetto accessibile nella funzione di confronto.

Valore restituito

bsearch_s restituisce un puntatore a un'occorrenza di key nella matrice a cui punta base. Se key non viene trovato, la funzione restituisce NULL. Se la matrice non è in ordine crescente o contiene record duplicati con chiavi identiche, il risultato è imprevedibile.

Se alla funzione vengono passati parametri non validi, richiama il gestore di parametri non validi come descritto in Convalida dei parametri. Se l'esecuzione può continuare, errno viene impostato su EINVAL e la funzione restituisce NULL. Per altre informazioni, vedereerrno, _doserrno, _sys_errliste _sys_nerr.

Condizioni di errore

key base compare number width Valore errno
NULL qualsiasi qualsiasi qualsiasi qualsiasi EINVAL
qualsiasi NULL qualsiasi != 0 qualsiasi EINVAL
qualsiasi qualsiasi qualsiasi qualsiasi =0 EINVAL
qualsiasi qualsiasi NULL any qualsiasi EINVAL

Osservazioni:

La funzione bsearch_s esegue una ricerca binaria di una matrice di elementi number ordinata, ognuno di width byte. Il valore base è un puntatore a base della matrice in cui eseguire la ricerca e key è il valore cercato. Il parametro compare è un puntatore a una routine fornita dall'utente che confronta la chiave richiesta a un elemento della matrice e restituisce uno dei valori seguenti che specifica la relazione:

Valore restituito dalla routine compare 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.

Il puntatore context può essere utile se la struttura dei dati cercati fa parte di un oggetto e la funzione di confronto deve accedere ai membri dell'oggetto. La funzione compare può eseguire il cast del puntatore void nel tipo di oggetto appropriato e accedere ai membri di tale oggetto. L'aggiunta context del parametro rende bsearch_s più sicuro, poiché il contesto può essere usato per evitare bug di reentrancy associati all'uso di variabili statiche per rendere i dati disponibili per la compare funzione.

Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificare questo comportamento, vedere Stato globale in CRT.

Requisiti

Ciclo Intestazione obbligatoria
bsearch_s <stdlib.h> e <search.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Esempio

Questo programma ordina una matrice di stringhe con qsort_se quindi usa bsearch_s per trovare la parola "cat".

// 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" );
}
cat cow dog goat horse human pig rat
cat found at 002F0F04

Vedi anche

Ricerca e ordinamento
_lfind
_lsearch
qsort