bsearch_s
Binarne wyszukuje posortowana tablica.To jest wersja bWyszukaj z rozszerzeń zabezpieczeń opisane 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 do wyszukiwania.base
Wskaźnik do podstawy wyszukiwania danych.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, które ma być porównana z key.context
Wskaźnik do obiektu, który można uzyskać dostępu do funkcji porównania.
Wartość zwracana
bsearch_sZwraca wskaźnik do wystąpieniakey 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 nieprzewidywalne.
Jeśli do funkcji przekazano nieprawidłowe parametry, wywoływana jest funkcja obsługi nieprawidłowy parametr, jak opisano w Sprawdzanie poprawności parametru.Jeśli wykonanie jest dozwolone, aby kontynuować, errnojest ustawiona na EINVAL i funkcja zwraca NULL.Aby uzyskać więcej informacji, zobacz errno, _doserrno, _sys_errlist i _sys_nerr.
Warunki błędów
key |
base |
compare |
num |
width |
errno |
NULL |
wszelkie |
wszelkie |
wszelkie |
wszelkie |
EINVAL |
wszelkie |
NULL |
wszelkie |
!= 0 |
wszelkie |
EINVAL |
wszelkie |
wszelkie |
wszelkie |
wszelkie |
= 0 |
EINVAL |
wszelkie |
wszelkie |
NULL |
an |
wszelkie |
EINVAL |
Uwagi
bsearch_s Funkcja wykonuje binarne wyszukiwania posortowana tablica z num elementów, każdy z width rozmiar bajtów.base Wartość jest wskaźnik do podstawy tablicy, które mają być przeszukiwane i key jest wartością poszukiwane.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ące ich relacji:
Wartość zwracana przez compare rutynowe |
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 danych wyszukiwany jest częścią obiektu i funkcji Porównaj musi mieć dostęp członków tego obiektu.compare Funkcji może oddać wskaźnik void do odpowiedniego obiektu typu i access członków tego obiektu.Dodanie context powoduje, że parametr bsearch_s bezpieczniejsze, ponieważ dodatkowy kontekst może służyć do uniknięcia chronometrażu błędów związanych z używaniem zmiennych statycznych do udostępnienia danych compare funkcji.
Wymagania
Rozpoczęto wykonywanie procedury |
Wymaganego nagłówka |
---|---|
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 wyszukać wyraz "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" );
}