Udostępnij za pośrednictwem


_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 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