_lfind_s
Führt eine lineare Suche nach dem angegebenen Schlüssel aus.Eine Version von _lfind mit unter Security Enhancements, wie in Sicherheitsfeatures im CRTbeschrieben.
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
);
Parameter
key
Das Objekt, nach dem gesucht werden soll.base
Zeiger auf die Basis für Suche von Daten.num
Die Anzahl der Arrayelemente.size
Größe von Arrayelementen in Bytes.compare
Zeiger auf die routine Vergleichs.Der erste Parameter ist der context Zeiger.Der zweite Parameter ist ein Zeiger für Suche zu verschlüsseln.Der dritte Parameter ist ein Zeiger auf den Schlüssel, Arrayelement, die verglichen werden soll.context
Ein Zeiger auf ein Objekt, das möglicherweise in der Vergleichsfunktion zugegriffen wird.
Rückgabewert
Wenn der Schlüssel nicht gefunden wird, gibt _lfind_s einen Zeiger auf das Element des Arrays bei diesem base Übereinstimmungen keyzurück.Wenn der Schlüssel nicht gefunden wird, gibt _lfind_sNULLzurück.
Wenn ungültige Parameter an die Funktion übergeben werden, wird der Ereignishandler aufgerufen, z. B. ungültige Parameter in Parametervalidierungbeschrieben.Wenn die Ausführung zulässig ist, um fortzufahren, wird errno zu EINVAL festgelegt, und die Funktion gibt NULLzurück.
Fehlerbedingungen
Schlüssel |
base |
compare |
num |
size |
errno |
---|---|---|---|---|---|
NULL |
alle |
alle |
alle |
alle |
EINVAL |
alle |
NULL |
alle |
!= 0 |
alle |
EINVAL |
alle |
alle |
alle |
alle |
0 (Null) |
EINVAL |
alle |
alle |
NULL |
ein |
alle |
EINVAL |
Hinweise
Die _lfind_s-Funktion führt eine lineare Suche nach dem Wert key in einem Array num einzelnen Elemente width von Bytes aus.Im Gegensatz zu bsearch_serfordert _lfind_s das Array nicht sortiert werden soll.Das base-Argument ist ein Zeiger auf der Basis des zu durchsuchenden Array.Das compare-Argument ist ein Zeiger auf eine benutzerdefinierte Routine, die zwei Arrayelemente verglichen und anschließend einen Wert zurückgibt, der die ihre Beziehung angibt._lfind_s ruft die Routine compare einmal oder mehrmals während der Suche an und übergibt den context Zeiger und die Zeiger auf zwei Arrayelementen bei jedem Aufruf.Die compare Routine muss die Elemente der Wert ungleich 0 (null) zurückgeben (Bedeutung, dass die Elemente unterscheiden) oder 0 (das heißt die Elemente vergleichen, müssen Sie identisch).
_lfind_s ist mit _lfind außer der Addition des context Zeigers auf den Argumenten der Vergleichsfunktion und der Parameterliste der Funktion ähnlich.Der context Zeiger kann nützlich sein, wenn die gesuchte Datenstruktur Teil eines Objekts ist und die Member des Objekts compare-Funktion verweisen muss.Die compare-Funktion kann den void-Zeiger in den entsprechenden Objekttyp umwandeln und Member dieses Objekts zu.Die Einführung des context-Parameters ist sicherer, da _lfind_s zusätzlicher Kontext verwendet werden kann, um die Reentranz zu vermeiden, die mit der Verwendung von statischen Variablen, um Daten zur Verfügung zu stellen die compare-Funktion zugeordnet sind.
Anforderungen
Routine |
Erforderlicher Header |
---|---|
_lfind_s |
<search.h> |
Weitere Informationen finden Sie unter Kompatibilität Kompatibilität in der Einführung.
Beispiel
// 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) );
}