Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Provede binární vyhledávání seřazeného pole. Tato funkce je verze bsearch s vylepšeními zabezpečení, jak je popsáno v funkcích zabezpečení v CRT.
Syntaxe
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
Ukazatel na klíč, který chcete vyhledat.
base
Ukazatel na základ vyhledávacích dat.
number
Počet prvků
width
Šířka prvků
compare
Funkce zpětného volání, která porovnává dva prvky. Prvním argumentem context je ukazatel. Druhý argument je ukazatel na key hledání. Třetí argument je ukazatel na prvek pole, který se má porovnat s key.
context
Ukazatel na objekt, ke kterému lze přistupovat ve funkci porovnání.
Vrácená hodnota
bsearch_s vrátí ukazatel na výskyt key v matici, na kterou baseodkazuje . Pokud key se nenajde, vrátí NULLfunkce . Pokud pole není ve vzestupném pořadí řazení nebo obsahuje duplicitní záznamy s identickými klíči, je výsledek nepředvídatelný.
Pokud jsou funkci předány neplatné parametry, vyvolá neplatnou obslužnou rutinu parametru, jak je popsáno v ověření parametru. Pokud je povoleno pokračovat provádění, errno je nastavena na EINVAL a funkce vrátí NULL. Další informace naleznete v tématu errno, _doserrno, _sys_errlista _sys_nerr.
Chybové podmínky
key |
base |
compare |
number |
width |
errno hodnota |
|---|---|---|---|---|---|
NULL |
jakékoliv | jakékoliv | jakékoliv | jakékoliv | EINVAL |
| jakékoliv | NULL |
jakékoliv | != 0 | jakékoliv | EINVAL |
| jakékoliv | jakékoliv | jakékoliv | jakékoliv | = 0 | EINVAL |
| jakékoliv | jakékoliv | NULL |
an | jakékoliv | EINVAL |
Poznámky
Funkce bsearch_s provádí binární vyhledávání seřazeného pole number prvků, přičemž každý z width bajtů má velikost. Hodnota base je ukazatel na základ pole, který se má prohledávat, a key je to hodnota, kterou hledáte. Parametr compare je ukazatel na rutinu zadanou uživatelem, která porovnává požadovaný klíč s prvkem pole a vrací jednu z následujících hodnot určujících jejich vztah:
Hodnota vrácená rutinou compare |
Popis |
|---|---|
| < 0 | Klíč je menší než prvek pole. |
| 0 | Klíč je roven prvku pole. |
| > 0 | Klíč je větší než prvek pole. |
Ukazatel context může být užitečný, pokud je prohledáná datová struktura součástí objektu a funkce porovnání potřebuje přístup k členům objektu. Funkce compare může přetypovat ukazatel void na příslušný typ objektu a přistupovat k členům tohoto objektu. Přidání parametru context je bsearch_s bezpečnější, protože kontext se může použít k tomu, aby se zabránilo opakovaným chybám přidruženým k použití statických proměnných k zpřístupnění compare dat pro funkci.
Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.
Požadavky
| Rutina | Požadovaný hlavičkový soubor |
|---|---|
bsearch_s |
<stdlib.h> a <search.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad
Tento program seřadí pole řetězců s řetězcem qsort_sa pak použije bsearch_s k vyhledání slova "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" );
}
cat cow dog goat horse human pig rat
cat found at 002F0F04