Condividi tramite


_lfind_s

Esegue una ricerca lineare della chiave specificata.una versione di _lfind con i miglioramenti della sicurezza come descritto in Funzionalità di sicurezza in 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
);

Parametri

  • key
    oggetto da cercare.

  • base
    Puntatore alla base dei dati trovati.

  • num
    Numero di elementi di matrice.

  • size
    Dimensione degli elementi di matrice in byte.

  • compare
    Puntatore alla routine di confronto.il primo parametro è context puntatore.il secondo parametro è un puntatore da impostare per la ricerca.Il terzo parametro è un puntatore all'elemento di matrice da confrontare con la chiave.

  • context
    Un puntatore a un oggetto che sia accessibile nella funzione di confronto.

Valore restituito

Se viene individuata la chiave, _lfind_s restituisce un puntatore all'elemento della matrice su base tale corrispondenze key.Se la chiave non viene trovata, _lfind_s restituisce NULL.

Se i parametri non validi vengono passati alla funzione, il gestore non valido di parametro viene richiamato, come descritto in Convalida dei parametri.Se l'esecuzione è consentita per continuare, errno è impostato su EINVAL e restituisce un valore di funzione NULL.

condizioni di errore

chiave

base

compare

num

size

errno

NULL

qualsiasi

qualsiasi

qualsiasi

qualsiasi

EINVAL

qualsiasi

NULL

qualsiasi

!= 0

qualsiasi

EINVAL

qualsiasi

qualsiasi

qualsiasi

qualsiasi

zero

EINVAL

qualsiasi

qualsiasi

NULL

an

qualsiasi

EINVAL

Note

_lfind_s la funzione esegue una ricerca lineare del valore key in una matrice di num elementi, ognuno di width byte.A differenza di bsearch_s, _lfind_s non richiede la matrice di essere ordinato.base l'argomento è un puntatore alla base della matrice da cercare.compare l'argomento è un puntatore a una routine fornita dall'utente che confronta due elementi di matrice e restituisce un valore che specifica la relazione._lfind_s chiama compare routine uno o più volte durante la ricerca, passare context puntatore e puntatori a due elementi della matrice a ogni chiamata.compare la routine deve confrontare gli elementi quindi restituisce diverso da zero (ovvero gli elementi sono diversi) o 0 (indicare gli elementi sono identici).

_lfind_s è simile a _lfind fatta eccezione per l'aggiunta di context puntatore agli argomenti della funzione di confronto ed elenchi di parametri di funzione.context il puntatore può essere utile se la struttura di dati trovata fa parte di un oggetto e compare necessità di funzione di accesso ai membri dell'oggetto.compare la funzione possibile eseguire il cast del puntatore a void nel tipo di oggetto appropriato e i membri di accesso dell'oggetto.L'aggiunta di context il parametro fa _lfind_s più sicuri che il contesto aggiuntivo può essere utilizzato per evitare dei bug con una reentrancy associati all'utilizzo delle variabili statiche per rendere i dati di compare funzione.

Requisiti

routine

Intestazione di associazione

_lfind_s

<search.h>

Per ulteriori informazioni sulla compatibilità, vedere Compatibilità nell'introduzione.

Esempio

// 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) );
}
  

Equivalente .NET Framework

Contains

Vedere anche

Riferimenti

Ricerca e ordinamento

bsearch_s

_lsearch_s

qsort_s

_lfind