Udostępnij za pośrednictwem


_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) );
}
  

Odpowiednik w programie .NET Framework

Contains

Zobacz też

Informacje

Wyszukiwanie i sortowanie danych

bsearch_s

_lsearch_s

qsort_s

_lfind