Condividi tramite


_lfind_s

Esegue una ricerca lineare della chiave specificata. Versione di con miglioramenti della _lfind sicurezza, come descritto in Funzionalità di sicurezza in CRT.

Sintassi

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 di ricerca.

number
Numero degli elementi della matrice.

size
Dimensione degli elementi della matrice in byte.

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

context
Puntatore a un oggetto che potrebbe essere accessibile nella funzione di confronto.

Valore restituito

Se la chiave viene trovata, _lfind_s restituisce un puntatore all'elemento della matrice in base che corrisponde a key. Se la chiave non viene trovata, _lfind_s restituisce NULL.

Se alla funzione vengono passati parametri non validi, viene richiamato il gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, errno viene impostato su EINVAL e la funzione restituisce NULL.

Condizioni di errore

key base compare number size errno
NULL qualsiasi qualsiasi qualsiasi qualsiasi EINVAL
qualsiasi NULL qualsiasi != 0 qualsiasi EINVAL
qualsiasi qualsiasi qualsiasi qualsiasi zero EINVAL
qualsiasi qualsiasi NULL any qualsiasi EINVAL

Osservazioni:

La funzione _lfind_s esegue una ricerca lineare del valore key in una matrice di number elementi, ognuno di size byte. A differenza di bsearch_s, _lfind_s non richiede l'ordinamento della matrice. L'argomento base è un puntatore alla base della matrice in cui eseguire la ricerca. L'argomento compare è un puntatore a una routine fornita dall'utente che confronta due elementi di matrice e quindi restituisce un valore che ne specifica la relazione. _lfind_s chiama la routine compare una o più volte durante la ricerca, passando il puntatore context e i puntatori a due elementi della matrice per ogni chiamata. La routine compare deve confrontare gli elementi e quindi restituire un valore diverso da zero (che indica che gli elementi sono diversi) o 0 (che indica che gli elementi sono identici).

_lfind_s è simile a _lfind con l'eccezione dell'aggiunta del puntatore context agli argomenti della funzione di confronto e all'elenco dei parametri della funzione. Il puntatore context può essere utile se la struttura dei dati sottoposta a ricerca fa parte di un oggetto e la funzione compare deve accedere ai membri dell'oggetto. La funzione compare può eseguire il cast del puntatore void nel tipo di oggetto appropriato e accedere ai membri di tale oggetto. L'aggiunta context del parametro rende _lfind_s più sicuro perché è possibile usare un contesto aggiuntivo per evitare bug di reentrancy associati all'uso di variabili statiche per rendere i dati disponibili per la compare funzione.

Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificare questo comportamento, vedere Stato globale in CRT.

Requisiti

Ciclo Intestazione obbligatoria
_lfind_s <search.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

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) );
}
weit found

Vedi anche

Ricerca e ordinamento
bsearch_s
_lsearch_s
qsort_s
_lfind