_lfind_s
Wykonuje liniowej wyszukiwania dla określonego klucza.Wersja z _lfind z rozszerzeń zabezpieczeń opisane w Funkcje zabezpieczeń w 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
);
Parametry
key
Obiekt do wyszukiwania.base
Wskaźnik do bazy danych wyszukiwania.num
Liczba elementów tablicy.size
Rozmiar elementów tablicy w bajtach.compare
Wskaźnik do rutynowych porównania.Pierwszy parametr jest context wskaźnik.Drugi parametr jest wskaźnik do klucza w celu wyszukiwania.Trzeci parametr jest wskaźnik do elementu tablicy, który należy porównać z kluczem.context
Wskaźnik do obiektu, który może być dostępny w funkcji porównania.
Wartość zwracana
Jeśli klucz zostanie znaleziony, _lfind_s zwraca wskaźnik do elementu tablicy w base , które odpowiadają key.Jeśli klawisz nie zostanie znaleziony, _lfind_s zwraca NULL.
Jeśli do funkcji przekazano nieprawidłowe parametry, nieprawidłowy parametr wywoływana jest funkcja obsługi, zgodnie z opisem w Sprawdzanie poprawności parametru.Jeśli wykonanie jest dozwolone, aby kontynuować, errno jest ustawiona na EINVAL i funkcja zwraca NULL.
Warunki błędów
klucz |
Base |
Porównaj |
NUM |
rozmiar |
errno |
---|---|---|---|---|---|
NULL |
wszelkie |
wszelkie |
wszelkie |
wszelkie |
EINVAL |
wszelkie |
NULL |
wszelkie |
!= 0 |
wszelkie |
EINVAL |
wszelkie |
wszelkie |
wszelkie |
wszelkie |
zero |
EINVAL |
wszelkie |
wszelkie |
NULL |
an |
wszelkie |
EINVAL |
Uwagi
_lfind_s Funkcja wykonuje liniowej wyszukiwania dla wartości key w tablicy num elementów, każdy z width bajtów.W odróżnieniu od bsearch_s, _lfind_s nie wymaga tablicy, które mają być sortowane.base Argument jest wskaźnik do podstawy tablicy, które mają być przeszukiwane.compare Argument jest wskaźnik do rutynowych dostarczone przez użytkownika, który porównuje dwa elementy tablicy, a następnie zwraca wartość, określając ich relacji._lfind_swywołania compare rutynowych jeden lub więcej razy podczas wyszukiwania, przekazując context wskaźnik i wskaźniki do dwóch elementów tablicy każdego wywołania.compare Rutynowych musi porównać elementy potem powrócić na niezerową (co oznacza że elementy są różne) lub 0 (to znaczy elementy są identyczne).
_lfind_sjest podobny do _lfind z wyjątkiem do dodawania context wskaźnik argumenty funkcji porównania i listy parametrów funkcji.context Wskaźnik może być przydatne, jeśli struktura danych wyszukiwany jest częścią obiektu i compare funkcja musi mieć dostęp członków tego obiektu.compare Funkcji można rzutować wskaźnik void do odpowiedniego obiektu typu i access członków tego obiektu.Dodanie context powoduje, że parametr _lfind_s bardziej bezpieczna, ponieważ kontekst dodatkowe można uniknąć błędów chronometrażu, związanych z używaniem zmiennych statycznych do udostępnienia danych compare funkcji.
Wymagania
Rozpoczęto wykonywanie procedury |
Wymaganego nagłówka |
---|---|
_lfind_s |
<search.h> |
Informacji dotyczących zgodności, zobacz Zgodność we wprowadzeniu.
Przykład
// 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) );
}