bsearch_s
Wykonuje wyszukiwanie binarne posortowanej tablicy. Ta funkcja jest wersją z ulepszeniami zabezpieczeń bsearch
zgodnie z opisem w temacie Funkcje zabezpieczeń w narzędziu CRT.
Składnia
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
);
Parametry
key
Wskaźnik do klucza do wyszukania.
base
Wskaźnik do podstawy danych wyszukiwania.
number
Liczba elementów.
width
Szerokość elementów.
compare
Funkcja wywołania zwrotnego, która porównuje dwa elementy. Pierwszym argumentem context
jest wskaźnik. Drugi argument jest wskaźnikiem key
dla wyszukiwania. Trzeci argument jest wskaźnikiem do elementu tablicy, który ma być porównywany z elementem key
.
context
Wskaźnik do obiektu, do którego można uzyskać dostęp w funkcji porównania.
Wartość zwracana
bsearch_s
Zwraca wskaźnik do wystąpienia key
w tablicy wskazywanej przez base
. Jeśli key
nie zostanie znaleziona, funkcja zwraca wartość NULL
. Jeśli tablica nie znajduje się w kolejności sortowania rosnącego lub zawiera zduplikowane rekordy z identycznymi kluczami, wynik jest nieprzewidywalny.
Jeśli do funkcji są przekazywane nieprawidłowe parametry, wywołuje ona nieprawidłową procedurę obsługi parametrów zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonywanie jest dozwolone do kontynuowania, jest ustawione na EINVAL
, errno
a funkcja zwraca wartość NULL
. Aby uzyskać więcej informacji, zobacz errno
, _doserrno
, _sys_errlist
i _sys_nerr
.
Warunki błędu
key |
base |
compare |
number |
width |
errno wartość |
---|---|---|---|---|---|
NULL |
dowolny | dowolny | dowolny | dowolny | EINVAL |
dowolny | NULL |
dowolny | != 0 | dowolny | EINVAL |
dowolny | dowolny | dowolny | dowolny | = 0 | EINVAL |
dowolny | dowolny | NULL |
an | dowolny | EINVAL |
Uwagi
Funkcja bsearch_s
wykonuje binarne wyszukiwanie posortowanej tablicy number
elementów o rozmiarze każdy z bajtów width
. Wartość base
jest wskaźnikiem do podstawy tablicy do przeszukania i key
jest poszukiwaną wartością. Parametr compare
jest wskaźnikiem do procedury dostarczonej przez użytkownika, która porównuje żądany klucz z elementem tablicy i zwraca jedną z następujących wartości określających ich relację:
Wartość zwracana przez compare procedurę |
opis |
---|---|
< 0 | Klucz jest mniejszy niż element tablicy. |
0 | Klucz jest równy elementowi tablicy. |
> 0 | Klucz jest większy niż element tablicy. |
Wskaźnik context
może być przydatny, jeśli przeszukana struktura danych jest częścią obiektu, a funkcja compare musi uzyskiwać dostęp do elementów członkowskich obiektu. Funkcja compare
może rzutowania wskaźnika void na odpowiedni typ obiektu i uzyskać dostęp do elementów członkowskich tego obiektu. Dodanie parametru context
zapewnia bsearch_s
większe bezpieczeństwo, ponieważ kontekst może służyć do uniknięcia ponownych usterek związanych z używaniem zmiennych statycznych w celu udostępnienia danych compare
funkcji.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
bsearch_s |
<stdlib.h> i <search.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
Ten program sortuje tablicę ciągów za pomocą qsort_s
polecenia , a następnie używa bsearch_s do znalezienia słowa "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