_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