bsearch_s
Binarne wyszukuje posortowaną tablicę.To jest wersja bsearch z ulepszeń zabezpieczeń, zgodnie z opisem w Funkcje zabezpieczeń w 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
);
Parametry
key
Obiekt używany do wyszukiwania.base
Wskaźnik do bazy danych wyszukiwania.num
Liczba elementów.width
Szerokość elementów.compare
Funkcja wywołania zwrotnego, który porównuje dwa elementy.Pierwszy argument jest context wskaźnik.Drugi argument jest wskaźnik do key dla wyszukiwania.Trzeci argument jest wskaźnik do elementu tablicy ma być porównana z key.context
Wskaźnik na obiekt, który można uzyskać dostęp do funkcji porównania.
Wartość zwracana
bsearch_sZwraca wskaźnik do wystąpienia key w tablicy wskazywanej przez base.Jeśli key nie zostanie znaleziony, funkcja zwraca NULL.Jeśli tablica nie jest w kolejności rosnącej lub zawiera zduplikowane rekordy z identyczne klucze, wynik jest nieprzewidywalna.
Jeżeli nie przekazano nieprawidłowe parametry funkcji, obsługa nieprawidłowy parametr jest wywoływany, zgodnie z opisem w Sprawdzanie poprawności parametru.Jeśli wykonanie będzie mógł kontynuować, errno jest ustawiona na EINVAL i funkcja zwraca NULL.Aby uzyskać więcej informacji, zobacz errno, _doserrno, _sys_errlist, and _sys_nerr.
Warunki błędów
key |
base |
compare |
num |
width |
errno |
NULL |
jakakolwiek |
jakakolwiek |
jakakolwiek |
jakakolwiek |
EINVAL |
jakakolwiek |
NULL |
jakakolwiek |
!= 0 |
jakakolwiek |
EINVAL |
jakakolwiek |
jakakolwiek |
jakakolwiek |
jakakolwiek |
= 0 |
EINVAL |
jakakolwiek |
jakakolwiek |
NULL |
an |
jakakolwiek |
EINVAL |
Uwagi
bsearch_s Funkcja Wyszukiwanie binarne posortowaną tablicę num elementów, każdy z width rozmiar bajtów.base Wartość jest wskaźnikiem do podstawy tablicy mają być przeszukiwane, i key jest wartością niestabilna.compare Parametr jest wskaźnik do rutynowych dostarczone przez użytkownika, który porównuje żądany klucz do elementu tablicy i zwraca jedną z następujących wartości, określając ich związek:
Wartość zwracana przez compare rutynowych |
Opis |
---|---|
< 0 |
Klucz jest mniejsza niż element tablicy. |
0 |
Klucz jest równa elementu tablicy. |
> 0 |
Klucz jest większy niż element tablicy. |
context Wskaźnik może być przydatne, jeśli struktura wyszukiwanych danych jest częścią obiektu, a funkcja Porównaj musi uzyskać dostęp do członków obiektu.compare Funkcja może oddać void wskaźnik do odpowiedniego obiektu typu i dostępu do członków tego obiektu.Dodanie context sprawia, że parametr bsearch_s bardziej bezpieczne, ponieważ dodatkowy kontekst może służyć do uniknięcia współużytkowania wątkowości błędów związanych z użyciem zmiennych statycznych do udostępnienia danych compare funkcji.
Wymagania
Procedura |
Wymagany nagłówek |
---|---|
bsearch_s |
<stdlib.h> i <search.h> |
Aby uzyskać dodatkowe informacje o zgodności, zobacz Zgodność we wprowadzeniu.
Przykład
Ten program sortuje tablicę ciągów z qsort_s, a następnie używa bsearch_s Aby znaleźć słowo "kot".
// 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" );
}