Exportar (0) Imprimir
Expandir todo
and
div
eof
not
or
xor
Expandir Minimizar
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

bsearch_s

Realiza una búsqueda binaria de un matriz ordenada. Ésta 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
);

key

Objeto para buscar.

base

Puntero a la base de datos de búsqueda.

num

Número de elementos.

width

Ancho de 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 key para la búsqueda. El tercer argumento es un puntero al elemento de matriz que se va a comparar con key.

context

Un puntero a un objeto que se puede tener acceso en la función de comparación.

bsearch_s devuelve un puntero a una aparicióndekey en la matriz indicada por base. Si key no se encuentra, la función devuelve NULL. Si la matriz no está en orden de forma ascendente o contiene los registros duplicados con claves idénticas, el resultado será imprevisible.

Si los parámetros no válidos se pasan a la función, se invoca el controlador no válido del parámetro tal como se describe en Validación de parámetros. Si la ejecución puede continuar, errnose establece en EINVAL y la función devuelve NULL. Para obtener más información, vea errno, _doserrno, _sys_errlist y _sys_nerr.

Condiciones de error

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

an

any

EINVAL

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

Valor devuelto por la rutina de compare

Descripción

< 0

La clave es menor que el elemento de matriz.

0

La clave es igual al elemento de matriz.

> 0

La clave es mayor que el elemento de matriz.

El puntero de context puede ser útil si la estructura de datos que se busca es parte de un objeto, y la función de comparar necesita tener acceso a los miembros del objeto. La función de compare puede convertir el puntero vacío en el tipo de objeto adecuado y tener acceso a los miembros de ese objeto. La adición del parámetro de context crea bsearch_s más seguro ya que el contexto adicional se puede utilizar para evitar los errores de reentrada asociados al uso de variables estáticas que los datos estén disponibles para la función de compare .

Rutina

Encabezado 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_s, y después utilizar bsearch_s para buscar la palabra “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" );
}
rata humana de cerdo de caballos de la cabra de perros de la vaca de gatos
gatos encontrado en 002F0F04

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft