_lfind_s
Wykonuje wyszukiwanie liniowe dla określonego klucza. Wersja z ulepszeniami zabezpieczeń _lfind
zgodnie z opisem w temacie Funkcje zabezpieczeń w narzędziu CRT.
Składnia
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 wyszukania.
base
Wskaźnik do podstawy danych wyszukiwania.
number
Liczba elementów tablicy.
size
Rozmiar elementów tablicy w bajtach.
compare
Wskaźnik do procedury porównania. Pierwszy parametr to context
wskaźnik. Drugi parametr jest wskaźnikiem do klucza wyszukiwania. Trzeci parametr jest wskaźnikiem do elementu tablicy, który ma być porównywany z kluczem.
context
Wskaźnik do obiektu, do którego można uzyskać dostęp w funkcji porównania.
Wartość zwracana
Jeśli klucz zostanie znaleziony, _lfind_s
zwraca wskaźnik do elementu tablicy w base
tym miejscu pasuje key
do elementu . Jeśli klucz nie zostanie znaleziony, _lfind_s
zwraca wartość NULL
.
Jeśli do funkcji są przekazywane nieprawidłowe parametry, wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonywanie jest dozwolone do kontynuowania, jest ustawione na EINVAL
, errno
a funkcja zwraca wartość NULL
.
Warunki błędu
key |
base |
compare |
number |
size |
errno |
---|---|---|---|---|---|
NULL |
dowolny | dowolny | dowolny | dowolny | EINVAL |
dowolny | NULL |
dowolny | != 0 | dowolny | EINVAL |
dowolny | dowolny | dowolny | dowolny | zero | EINVAL |
dowolny | dowolny | NULL |
an | dowolny | EINVAL |
Uwagi
Funkcja _lfind_s
wykonuje liniowe wyszukiwanie wartości key
w tablicy number
elementów, każdy z bajtów size
. W przeciwieństwie do bsearch_s
metody , _lfind_s
nie wymaga sortowania tablicy. Argument base
jest wskaźnikiem do podstawy tablicy do przeszukania. Argument compare
jest wskaźnikiem do procedury dostarczonej przez użytkownika, która porównuje dwa elementy tablicy, a następnie zwraca wartość określającą ich relację. _lfind_s
wywołuje procedurę compare
co najmniej raz podczas wyszukiwania, przekazując context
wskaźnik i wskaźniki do dwóch elementów tablicy w każdym wywołaniu. Rutyna compare
musi porównać elementy, a następnie zwrócić niezero (co oznacza, że elementy są różne) lub 0 (co oznacza, że elementy są identyczne).
_lfind_s
jest podobny do tego, z _lfind
wyjątkiem dodawania context
wskaźnika do argumentów funkcji porównania i listy parametrów funkcji. Wskaźnik context
może być przydatny, jeśli przeszukana struktura danych jest częścią obiektu, a compare
funkcja musi uzyskiwać dostęp do elementów członkowskich obiektu. Funkcja compare
może rzutować wskaźnik void na odpowiedni typ obiektu i uzyskać dostęp do elementów członkowskich tego obiektu. Dodanie parametru context
sprawia, że _lfind_s
jest bezpieczniejszy, ponieważ można użyć dodatkowego kontekstu, aby uniknąć ponownych błędów skojarzonych z używaniem zmiennych statycznych w celu udostępnienia danych compare
funkcji.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
_lfind_s |
<search.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
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) );
}
weit found
Zobacz też
Wyszukiwanie i sortowanie
bsearch_s
_lsearch_s
qsort_s
_lfind