Sdílet prostřednictvím


_lfind_s

Provede lineární vyhledávání zadaného klíče. Verze _lfind s vylepšeními zabezpečení, jak je popsáno v funkcích zabezpečení v CRT.

Syntaxe

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
Objekt, který chcete vyhledat.

base
Ukazatel na základ vyhledávacích dat.

number
Počet prvků pole

size
Velikost prvků pole v bajtech

compare
Ukazatel na rutinu porovnání Prvním parametrem context je ukazatel. Druhý parametr je ukazatel na klíč pro hledání. Třetí parametr je ukazatel na prvek pole, který se má porovnat s klíčem.

context
Ukazatel na objekt, ke kterému může být přístup v porovnávací funkci.

Vrácená hodnota

Pokud je klíč nalezen, _lfind_s vrátí ukazatel na prvek pole, který base odpovídá key. Pokud se klíč nenajde, _lfind_s vrátí hodnotu NULL.

Pokud jsou funkci předány neplatné parametry, vyvolá se neplatná obslužná rutina parametru, jak je popsáno v ověření parametru. Pokud je povoleno pokračovat provádění, errno je nastavena na EINVAL a funkce vrátí NULL.

Chybové podmínky

key base compare number size errno
NULL jakékoliv jakékoliv jakékoliv jakékoliv EINVAL
jakékoliv NULL jakékoliv != 0 jakékoliv EINVAL
jakékoliv jakékoliv jakékoliv jakékoliv žádný EINVAL
jakékoliv jakékoliv NULL an jakékoliv EINVAL

Poznámky

Funkce _lfind_s provádí lineární vyhledávání hodnoty key v matici number prvků, z nichž každý z size bajtů. Na rozdíl od bsearch_spole _lfind_s nevyžaduje řazení. Argument base je ukazatel na základ pole, který se má prohledávat. Argument compare je ukazatel na rutinu zadanou uživatelem, která porovnává dva prvky pole a poté vrátí hodnotu určující jejich relaci. _lfind_s volá rutinu compare jednou nebo vícekrát během hledání a předává context ukazatel a ukazatele na dva prvky pole při každém volání. Rutina compare musí porovnat prvky a pak vrátit nenulové (což znamená, že se prvky liší) nebo 0 (což znamená, že prvky jsou identické).

_lfind_s je podobný s _lfind výjimkou přidání context ukazatele na argumenty funkce porovnání a seznamu parametrů funkce. Ukazatel context může být užitečný, pokud je prohledáná datová struktura součástí objektu a compare funkce potřebuje přístup k členům objektu. Funkce compare může přetypovat ukazatel void na příslušný typ objektu a přistupovat k členům tohoto objektu. Přidání parametru context je _lfind_s bezpečnější, protože je možné použít další kontext, aby se zabránilo opakovaným chybám přidruženým k používání statických proměnných, aby byla data dostupná pro compare funkci.

Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.

Požadavky

Rutina Požadovaný hlavičkový soubor
_lfind_s <search.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad

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

Viz také

Vyhledávání a řazení
bsearch_s
_lsearch_s
qsort_s
_lfind