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