Exporter (0) Imprimer
Développer tout
and
div
eof
not
or
xor
Développer Réduire
Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. Informations supplémentaires.
Traduction
Source

_lfind_s

Effectue une recherche linéaire pour la clé spécifiée. Il s'agit de versions de _lfind avec des améliorations de sécurité, comme décrit dans Fonctionnalités de sécurité dans le 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
);

key

Objet à rechercher.

base

Pointeur vers la base de données de recherche.

num

Nombre d'éléments du tableau.

size

Taille des éléments du tableau en octets.

compare

Pointeur vers la routine de comparaison. Le premier paramètre est le pointeur context. Le deuxième paramètre est un pointeur vers la clé pour la recherche. Le troisième paramètre est un pointeur vers un élément de tableau à comparer à la clé.

context

Un pointeur vers un objet, qui peut être accessible dans la fonction de comparaison.

Si la clé est trouvée, _lfind_s retourne un pointeur vers l'élément du tableau à basequi correspond àkey . Si la clé n'est pas trouvée_lfind_sretourne NULL.

Si des paramètres non valides sont transmis à la fonction, le gestionnaire de paramètre non valide est appelé, comme décrit dans Validation de paramètre. Si l'exécution est autorisée à se poursuivre, errno est défini à EINVAL et la fonction retourne NULL.

Conditions d'erreur

key

base

compare

num

taille

errno

NULL

ANY

ANY

ANY

ANY

EINVAL

ANY

NULL

ANY

!= 0

ANY

EINVAL

ANY

ANY

ANY

ANY

zéro

EINVAL

ANY

ANY

NULL

Un

ANY

EINVAL

La fonction _lfind_s effectue une recherche séquentielle pour la valeur key dans un tableau d'éléments de numéléments, chacun dewidthoctets. Contrairement à bsearch_s, _lfind_s ne nécessite pas que le tableau soit trié. L'argument base est un pointeur vers la base du tableau à trier. La fonction compare est un pointeur vers une routine fournie à l'utilisateur, qui compare deux éléments de tableau et retourne une valeur qui spécifie leur relation. _lfind_s appelle la routine compare à une ou plusieurs reprises lors de la recherche, en passant un pointeur context et des pointeurs à deux éléments de tableau à chaque appel. La routine compare doit comparer les éléments puis retourner une valeur différente de zéro (c'est-à-dire que les éléments sont différents) ou 0 (ce qui signifie les éléments sont identiques).

_lfind_s est similaire à _lfind sauf quand à l'ajout du pointeur context aux arguments de la fonction de comparaison et de la liste des paramètres de la fonction. Le pointeur context peut être utile si la structure de données recherchée fait partie d'un objet et que la fonction compare doit accéder à des membres de l'objet. La fonction compare peut convertir le pointeur void au type d'objet approprié et accéder aux membres de cet objet. L'ajout du pointeur context permet de rendre_lfind_s plus sécurisé car le contexte supplémentaire peut être utilisé pour éviter les bogues de reentrées associés à l'utilisation des variables statiques pour rendre les données disponibles à la fonction compare.

Routine

En-tête requis

_lfind_s

<Rechercher>

Pour plus d'informations sur la compatibilité, consultez Compatibilité dans l'introduction.

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

Ajouts de la communauté

AJOUTER
Microsoft réalise une enquête en ligne pour recueillir votre opinion sur le site Web de MSDN. Si vous choisissez d’y participer, cette enquête en ligne vous sera présentée lorsque vous quitterez le site Web de MSDN.

Si vous souhaitez y participer,
Afficher:
© 2014 Microsoft