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