Sdílet prostřednictvím


bsearch_s

Provádí binární hledání seřazené pole.Toto je verze bsearch s vylepšení zabezpečení, jak je popsáno v Funkce zabezpečení v 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
    Objekt, který chcete vyhledat.

  • base
    Ukazatel na základní vyhledávání údajů.

  • num
    Počet prvků.

  • width
    Šířka prvky.

  • compare
    Funkce zpětného volání, který porovnává dva prvky.První argument je context ukazatele.Druhý argument je ukazatel key pro hledání.Třetí argument je ukazatel na prvek pole, která se má porovnat s key.

  • context
    Ukazatel na objekt, který je přístupný ve funkci porovnání.

Vrácená hodnota

bsearch_svrací ukazatel na výskyt key v poli, na kterou odkazuje base.Pokud key nebyl nalezen, vrátí funkce NULL.Pokud pole není ve vzestupném pořadí řazení nebo stejné klíče obsahuje duplicitní záznamy, výsledkem nepředvídatelné.

Pokud jsou předány neplatné parametry funkce, je vyvolána neplatný parametr obslužné rutiny, jak je popsáno v Ověření parametru.Pokud je povoleno zpracování pokračovat, errno je nastavena na EINVAL a vrátí funkce NULL.Další informace naleznete v tématu errno, _doserrno, _sys_errlist, and _sys_nerr.

Chybové podmínky

key

base

compare

num

width

errno

NULL

any

any

any

any

EINVAL

any

NULL

any

!= 0

any

EINVAL

any

any

any

any

= 0

EINVAL

any

any

NULL

e

any

EINVAL

Poznámky

bsearch_s Funkce provádí binární hledání seřazené pole z num prvky, každý z width bajty.base Hodnota je ukazatel na základ pole, které mají být prohledány a key je předložena žádost o hodnotu.compare Je parametr ukazatel na uživatelem zadaný rutina, která porovná klíč požadovaného prvku pole a vrátí jednu z následujících hodnot určujících jejich vztah:

Hodnotu vrácenou compare rutina

Description

< 0

Klíč je menší než prvek pole.

0

Klíč je prvek pole.

> 0

Klíč je větší než prvek pole.

context Ukazatel může být užitečné, pokud prohledávaných datová struktura je část objektu a funkce porovnání musí pro přístup k členům tohoto objektu.compare Funkce mohou neplatný ukazatel přetypovat na příslušný objekt typu a přístup členů daného objektu.Přídavek context je parametr bsearch_s bezpečnější, protože další souvislosti lze zabránit vícenásobnému přístupu chyby přidružené ke zpřístupnění dat pomocí statické proměnné compare funkce.

Požadavky

Rutina

Požadované záhlaví

bsearch_s

<stdlib.h> a <search.h>

Další informace o kompatibilitě, viz Kompatibilita v úvodu.

Příklad

Tento program řadí řetězců se qsort_sa potom použije bsearch_s vyhledejte slovo "kočka".

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

Ekvivalent v rozhraní .NET Framework

BinarySearch

Viz také

Referenční dokumentace

Vyhledávání a třídění

_lfind

_lsearch

qsort