_lfind_s
Effectue une recherche linéaire portant sur la clé spécifiée. Version des améliorations de _lfind
sécurité décrites dans les fonctionnalités de sécurité du CRT.
Syntaxe
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
);
Paramètres
key
Objet à rechercher.
base
Pointeur désignant la base de données de recherche.
number
Nombre d’éléments de tableau.
size
Taille des éléments de tableau en octets.
compare
Pointeur désignant la routine de comparaison. Le premier paramètre est le pointeur context
. Le deuxième paramètre est un pointeur désignant la clé pour la recherche. Le troisième paramètre est un pointeur désignant l’élément de tableau à comparer à la clé.
context
Pointeur désignant un objet accessible dans la fonction de comparaison.
Valeur retournée
Si la clé est trouvée, _lfind_s
retourne un pointeur désignant l’élément du tableau à base
qui correspond à key
. Si la clé est introuvable, _lfind_s
retourne NULL
.
Si des paramètres non valides sont passés à la fonction, le gestionnaire de paramètres non valide est appelé, comme décrit dans la validation des paramètres. Si l’exécution est autorisée à se poursuivre, errno
a la valeur EINVAL
et la fonction retourne NULL
.
Conditions d’erreur
key |
base |
compare |
number |
size |
errno |
---|---|---|---|---|---|
NULL |
n'importe laquelle | tous | tous | tous | EINVAL |
tous | NULL |
n'importe laquelle | != 0 | n'importe laquelle | EINVAL |
tous | tous | tous | n'importe laquelle | zero | EINVAL |
n'importe laquelle | n'importe laquelle | NULL |
an | n'importe laquelle | EINVAL |
Notes
La fonction _lfind_s
effectue une recherche linéaire portant sur la valeur key
dans un tableau de number
éléments, chacun d’une taille de size
octets. Contrairement bsearch_s
à , _lfind_s
ne nécessite pas le tri du tableau. L’argument base
est un pointeur désignant la base du tableau à explorer. L’argument compare
est un pointeur désignant une routine fournie par l’utilisateur qui compare deux éléments de tableau, puis retourne une valeur spécifiant leur relation. _lfind_s
appelle la routine compare
une ou plusieurs fois pendant la recherche, passant le pointeur context
et les pointeurs désignant deux éléments de tableau à chaque appel. La routine compare
doit comparer les éléments, puis retourner une valeur différente de zéro (les éléments sont différents) ou 0 (les éléments sont identiques).
_lfind_s
est semblable à _lfind
, à ceci près que le pointeur context
est ajouté aux arguments de la fonction de comparaison et à la liste des paramètres de la fonction. Le pointeur context
peut être utile si la structure de données explorée fait partie d’un objet et que la fonction compare
doit accéder aux membres de l’objet. La fonction compare
peut effectuer un cast du pointeur void vers le type d’objet approprié et accéder aux membres de cet objet. L’ajout du context
paramètre rend _lfind_s
plus sécurisé, car un contexte supplémentaire peut être utilisé pour éviter les bogues de réentrance associés à l’utilisation de variables statiques pour rendre les données disponibles pour la compare
fonction.
Par défaut, l’état global de cette fonction est limité à l’application. Pour modifier ce comportement, consultez État global dans le CRT.
Spécifications
Routine | En-tête requis |
---|---|
_lfind_s |
<search.h> |
Pour plus d’informations sur la compatibilité, consultez Compatibility.
Exemple
// 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