_lfind_s
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 en CRT.
Sintaxis
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 los datos de búsqueda.
number
Número de elementos de la matriz.
size
Tamaño de los elementos de la matriz expresados en bytes.
compare
Puntero a la rutina de comparación. El primer parámetro es el puntero context
. 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 que se va a comparar con la clave.
context
Un puntero a un objeto al que se podría obtener acceso en la función de comparación.
Valor devuelto
Si se encuentra la clave, _lfind_s
devuelve un puntero al elemento de la matriz en base
que coincide 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 de parámetros. Si la ejecución puede continuar, errno
está establecido en EINVAL
y la función devuelve NULL
.
Condiciones del error
key |
base |
compare |
number |
size |
errno |
---|---|---|---|---|---|
NULL |
cualquiera | cualquiera | cualquiera | cualquiera | EINVAL |
cualquiera | NULL |
cualquiera | != 0 | cualquiera | EINVAL |
cualquiera | cualquiera | cualquiera | cualquiera | zero | EINVAL |
cualquiera | cualquiera | NULL |
an | cualquiera | EINVAL |
Comentarios
La función _lfind_s
realiza una búsqueda lineal del valor key
en una matriz de number
elementos, cada uno de ellos de size
bytes. A diferencia bsearch_s
de , _lfind_s
no requiere que la matriz se ordene. El argumento base
es un puntero a la base de la matriz que se va a buscar. El argumento compare
es un puntero a una rutina proporcionada por el usuario que compara dos elementos de la matriz y luego devuelve un valor que especifica su relación. _lfind_s
llama a la rutina compare
una o varias veces durante la búsqueda, pasando el puntero context
y los punteros a dos elementos de la matriz en cada llamada. La rutina compare
debe comparar los elementos y luego devolver un valor distinto de cero (es decir, los elementos son diferentes) o 0 (es decir, los elementos son idénticos).
_lfind_s
es similar a _lfind
, salvo por la adición del puntero context
a los argumentos de la función de comparación y la lista de parámetros de la función. El puntero context
puede ser útil si la estructura de datos de búsqueda forma parte de un objeto y la función compare
necesita obtener acceso 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 context
parámetro hace _lfind_s
más segura porque se puede usar contexto adicional para evitar errores de reentrada asociados con el uso de variables estáticas para que los datos estén disponibles para la compare
función.
De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.
Requisitos
Routine | Encabezado necesario |
---|---|
_lfind_s |
<search.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
// 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