Se recomienda usar Visual Studio 2017

bsearch_s

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Realiza una búsqueda binaria de una matriz ordenada. Esta es la versión de bsearch con mejoras de seguridad, como se describe en características de seguridad de 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  
);  

Parámetros

key
Objeto que se va a buscar.

base
Puntero a la base de datos de búsqueda.

num
Número de elementos.

width
Ancho de los elementos.

compare
Función de devolución de llamada que compara dos elementos. El primer argumento es el puntero de context . El segundo argumento es un puntero a la key de la búsqueda. El tercer argumento es un puntero al elemento de matriz que va a comparar con key.

context
Un puntero a un objeto al que se puede acceder en la función de comparación.

bsearch_sDevuelve un puntero a una instancia dekey en la matriz señalada por base. Si no encuentra key , la función devuelve NULL. Si la matriz no está en orden ascendente o contiene registros duplicados con claves idénticas, el resultado es impredecible.

Si se pasan parámetros no válidos a la función, se invoca el controlador de parámetros no válidos como se describe en Parameter Validation. Si la ejecución puede continuar, errnoestá establecido en EINVAL y la función devuelve NULL. Para obtener más información, consulte errno, _doserrno, _sys_errlist y _sys_nerr.

Condiciones de error

keybasecomparenumwidtherrno
NULLcualquieracualquieracualquieracualquieraEINVAL
cualquieraNULLcualquiera!= 0cualquieraEINVAL
cualquieracualquieracualquieracualquiera= 0EINVAL
cualquieracualquieraNULLancualquieraEINVAL

La función bsearch_s realiza una búsqueda binaria de una matriz ordenada de elementos num , cada uno de ellos con un tamaño de width bytes. El valor base es un puntero a la base de la matriz que se va a buscar y key es el valor buscado. El parámetro compare es un puntero a una rutina proporcionada por el usuario que compara la clave solicitada con un elemento de matriz y devuelve uno de los siguientes valores que especifica su relación:

Valor devuelto por la rutina compareDescripción
< 0El valor de clave es menor que el elemento de matriz.
0El valor de clave es igual al elemento de matriz.
> 0El valor de clave es mayor que el elemento de matriz.

El puntero context puede ser útil si la estructura de datos de búsqueda es parte de un objeto y la función de comparación necesita acceder a los miembros del objeto. La función compare puede convertir el puntero void en el tipo de objeto adecuado y acceder a los miembros de dicho objeto. La adición del parámetro context hace que bsearch_s sea más seguro, ya que puede usarse contexto adicional para evitar errores de reentrada asociados al uso de variables estáticas para que los datos estén disponibles para la función compare .

RutinaEncabezado necesario
bsearch_s<stdlib.h> y <search.h>

Para obtener información adicional de compatibilidad, vea Compatibilidad en la Introducción.

Este programa ordena una matriz de cadenas con qsort_sy, luego, usa bsearch_s para buscar la palabra "cat".

// 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  

BinarySearch

Buscar y ordenar
_lfind
_lsearch
qsort

Mostrar: