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_errlist
e _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_s
e 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