Udostępnij za pośrednictwem


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_errlisti _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_spolecenia , 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

Zobacz też

Wyszukiwanie i sortowanie
_lfind
_lsearch
qsort