Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 keydo 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_smetody , _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