_lfind_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 lineal de la clave especificada. Una versión de _lfind con mejoras de seguridad, como se describe en características de seguridad de CRT.

void *_lfind_s(  
   const void *key,  
   const void *base,  
   unsigned int *num,  
   size_t size,  
   int (__cdecl *compare)(void *, const void *, const void *),  
   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 de la matriz.

size
Tamaño de elementos de matriz de bytes.

compare
Puntero a la rutina de comparación. El primer parámetro es el context puntero. El segundo parámetro es un puntero a la clave de búsqueda. El tercer parámetro es un puntero al elemento de la matriz va a comparar con la clave.

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

Si se encuentra la clave, _lfind_s devuelve un puntero al elemento de la matriz en base que coincida con key. Si no se encuentra la clave, _lfind_s devuelve NULL.

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 validación del parámetro. Si la ejecución puede continuar, errno se establece en EINVAL y la función devuelve NULL.

Condiciones de error

keybasecomparenumsizeerrno
NULLcualquieracualquieracualquieracualquieraEINVAL
cualquieraNULLcualquiera!= 0cualquieraEINVAL
cualquieracualquieracualquieraanyceroEINVAL
anycualquieraNULLancualquieraEINVAL

El _lfind_s función realiza una búsqueda lineal para el valor key en una matriz de num elementos, cada uno de los width bytes. A diferencia de bsearch_s, _lfind_s no requiere que la matriz esté ordenada. El base argumento es un puntero a la base de la matriz que se va a buscar. El compare argumento es un puntero a una rutina proporcionada por el usuario que compara dos elementos de la matriz y, a continuación, devuelve un valor que indica su relación. _lfind_sllamadas del compare rutinas una o varias veces durante la búsqueda, pasando el context puntero y punteros a dos elementos de la matriz en cada llamada. El compare rutina debe comparar los elementos a devolver es distinto de cero (lo que significa que los elementos son diferentes) o 0 (es decir, los elementos son idénticos).

_lfind_ses similar a _lfind excepto por la adición de la context puntero a los argumentos de la función de comparación y la lista de parámetros de la función. El context puntero puede ser útil si la estructura de datos de búsqueda es parte de un objeto y el compare función necesita tener acceso a los miembros del objeto. El compare función puede convertir el puntero void en los miembros de tipo y el acceso de objeto correspondiente de ese objeto. La adición de la context parámetro hace _lfind_s más segura porque el contexto adicional puede utilizarse para evitar errores de reentrada asociados al uso de variables estáticas para que los datos disponibles para el compare (función).

RutinaEncabezado necesario
_lfind_s<search.h></search.h>

Para obtener más información sobre compatibilidad, vea Compatibility en la introducción.

// crt_lfind_s.cpp  
// This program uses _lfind_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  
// Codepage 850 is the OEM codepage used by the command line,  
// so \x00e1 is the German Sharp S  
  
char *array1[] = { "wei\x00e1", "weis", "annehmen", "weizen", "Zeit",  
                   "weit" };  
  
#define GERMAN_LOCALE "German_Germany.850"  
  
#endif  
  
#ifdef CODEPAGE_1252  
   // If using codepage 1252 (ISO 8859-1, Latin-1), use \x00df  
   // for the German Sharp S  
char *array1[] = { "wei\x00df", "weis", "annehmen", "weizen", "Zeit",  
                   "weit" };  
  
#define GERMAN_LOCALE "German_Germany.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, const void *str1, const void *str2)  
{  
    char *s1 = *(char**)str1;  
    char *s2 = *(char**)str2;  
  
    locale& loc = *( reinterpret_cast< locale * > ( pvlocale));  
  
    return use_facet< collate<char> >(loc).compare(  
       s1, s1+strlen(s1),  
       s2, s2+strlen(s2) );  
}  
  
void find_it( char *key, char *array[], unsigned int num, locale &loc )  
{  
   char **result = (char **)_lfind_s( &key, array,   
                      &num, sizeof(char *), compare, &loc );  
   if( result )  
      printf( "%s found\n", *result );  
   else  
      printf( "%s not found\n", key );  
}  
  
int main( )  
{  
   find_it( "weit", array1, sizeof(array1)/sizeof(char*), locale(GERMAN_LOCALE) );  
}  

weit found  

Contiene

Buscar y ordenar
bsearch_s
_lsearch_s
qsort_s
_lfind

Mostrar: