bsearch_s
Provádí binární hledání seřazené pole.Toto je verze bsearch s vylepšení zabezpečení popsaným 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 hledání.base
Základní hledání dat ukazatele.num
Počet prvků.width
Šířka prvky.compare
Funkce zpětného volání, který porovnává dva prvky.První argument je context ukazatel.Druhý argument je ukazatel na key pro hledání.Třetí argument je ukazatel na prvek pole, která se porovná s key.context
Ukazatel na objekt, který je přístupný funkce porovnání.
Vrácená hodnota
bsearch_sVrací ukazatel na výskytkey pole, na kterou odkazuje base.Pokud key nebyl nalezen, vrátí funkce NULL.Pokud pole není ve vzestupném pořadí, nebo s stejné klíče obsahuje duplicitní záznamy, výsledkem nepředvídatelné.
Pokud funkci jsou předány neplatné parametry, je parametr neplatný popisovač vyvoláno popsaným v Ověření parametrů.Pokud je povoleno spuštění pokračovat, errnoje nastavena na EINVAL a vrátí funkce NULL.Další informace naleznete v tématu Kód chyby, _doserrno, _sys_errlist a _sys_nerr.
Chybové podmínky
key |
base |
compare |
num |
width |
errno |
NULL |
žádné |
žádné |
žádné |
žádné |
EINVAL |
žádné |
NULL |
žádné |
!= 0 |
žádné |
EINVAL |
žádné |
žádné |
žádné |
žádné |
= 0 |
EINVAL |
žádné |
žádné |
NULL |
aplikace |
žádné |
EINVAL |
Poznámky
bsearch_s Funkce provádí binární hledání seřazené pole num prvky, každý z width velikost bajtů.base Je hodnota ukazatele na základní pole, které chcete prohledat, a key je hodnota, která se žádá.compare Parametr je ukazatel na uživatelský rutina, která porovnává požadovaný klíč prvku pole a vrátí jednu z následujících hodnot určujících jejich vztah:
Hodnota vrácená compare rutina |
Description |
---|---|
< 0 |
Klíč je menší než prvek pole. |
0 |
Klíč je rovna prvek pole. |
> 0 |
Klíč je větší než prvek pole. |
context Ukazatel může být užitečné, pokud struktura vyhledávaných dat je částí objektu a funkce compare potřebuje přístup členy objektu.compare Funkce může hlasovat neplatný ukazatel na příslušný objekt typu a přístup členů daného objektu.Přídavek context parametr díky bsearch_s bezpečnější, protože další kontext pro zamezení předpokladem chyby související s použitím statické proměnné k dispozici data 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 seřadí pole řetězců s qsort_sa potom pomocí bsearch_s najít 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" );
}