bsearch_s
Executa uma pesquisa binária de uma matriz classificada. Essa função é uma versão do com aprimoramentos de bsearch
segurança, conforme descrito em Recursos de segurança no CRT.
Sintaxe
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
);
Parâmetros
key
Ponteiro para a chave a ser pesquisada.
base
Ponteiro para a base dos dados de pesquisa.
number
Número de elementos.
width
Largura de elementos.
compare
Função de retorno de chamada que compara dois elementos. O primeiro argumento é o ponteiro context
. O segundo argumento é um ponteiro para o key
para a pesquisa. O terceiro argumento é um ponteiro para o elemento de matriz a ser comparado com key
.
context
Um ponteiro para um objeto que pode ser acessado na função de comparação.
Valor retornado
bsearch_s
retorna um ponteiro para uma ocorrência de key
na matriz apontada por base
. Se key
não for encontrado, a função retornará NULL
. Se a matriz não estiver em ordem de classificação crescente ou contiver registros duplicados com chaves idênticas, o resultado será imprevisível.
Se parâmetros inválidos forem passados para a função, ela invocará o manipulador de parâmetro inválido, conforme descrito em Validação de parâmetro. Se a execução tiver permissão para continuar, errno
será definido como EINVAL
e a função retornará NULL
. Para obter mais informações, consulte errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Condições de erro
key |
base |
compare |
number |
width |
errno valor |
---|---|---|---|---|---|
NULL |
any | qualquer | qualquer | qualquer | EINVAL |
qualquer | NULL |
any | != 0 | any | EINVAL |
qualquer | qualquer | qualquer | any | = 0 | EINVAL |
any | any | NULL |
an | any | EINVAL |
Comentários
A função bsearch_s
realiza uma pesquisa binária de uma matriz classificada de number
elementos, cada um com width
bytes de tamanho. O valor base
é um ponteiro para a base da matriz a ser pesquisada e key
é o valor que está sendo procurado. O parâmetro compare
é um ponteiro para uma rotina fornecida pelo usuário que compara a chave solicitada para um elemento de matriz e retorna um dos valores a seguir especificando seu relacionamento:
Valor retornado pela rotina compare |
Descrição |
---|---|
< 0 | A chave é menor que o elemento da matriz. |
0 | A chave é igual ao elemento da matriz. |
> 0 | A chave é maior que o elemento da matriz. |
O ponteiro context
poderá ser útil se a estrutura de dados pesquisada fizer parte de um objeto e a função compare precisar acessar membros do objeto. A função compare
pode converter o ponteiro void no tipo de objeto apropriado e acessar membros desse objeto. A adição do context
parâmetro torna bsearch_s
mais seguro, pois o contexto pode ser usado para evitar bugs de reentrância associados ao uso de variáveis estáticas para disponibilizar dados para a compare
função.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.
Requisitos
Rotina | Cabeçalho necessário |
---|---|
bsearch_s |
<stdlib.h> e <search.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
Este programa classifica uma matriz de strings com qsort_s
, e usa bsearch_s para encontrar a palavra "gato".
// 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