Aracılığıyla paylaş


_lfind_s

Belirtilen anahtar için doğrusal bir arama gerçekleştirir. CRT'deki Güvenlik özellikleri bölümünde açıklandığı gibi güvenlik geliştirmeleri içeren sürümü_lfind.

Sözdizimi

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

Parametreler

key
Aranacak nesne.

base
Arama verilerinin tabanına işaretçi.

number
Dizi öğelerinin sayısı.

size
Dizi öğelerinin bayt cinsinden boyutu.

compare
Karşılaştırma yordamı işaretçisi. İlk parametre işaretçidir context . İkinci parametre, arama için bir tuş işaretçisidir. Üçüncü parametre, anahtarla karşılaştırılacak dizi öğesinin işaretçisidir.

context
Karşılaştırma işlevinde erişilebilen bir nesnenin işaretçisi.

Dönüş değeri

Anahtar bulunursa, _lfind_s dizinin öğesiyle base eşleşen keybir işaretçi döndürür. Anahtar bulunamazsa döndürür _lfind_s NULL.

İşleve geçersiz parametreler geçirilirse, Parametre doğrulama bölümünde açıklandığı gibi geçersiz parametre işleyicisi çağrılır. Yürütmenin devam etmesi için izin verilirse, errno olarak ayarlanır EINVAL ve işlevi döndürür NULL.

Hata koşulları

key base compare number size errno
NULL herhangi bir herhangi bir herhangi bir herhangi bir EINVAL
herhangi bir NULL herhangi bir != 0 herhangi bir EINVAL
herhangi bir herhangi bir herhangi bir herhangi bir sıfır EINVAL
herhangi bir herhangi bir NULL an herhangi bir EINVAL

Açıklamalar

işlevi, _lfind_s baytların her size biri olan bir öğe dizisindeki number değer key için doğrusal bir arama gerçekleştirir. _lfind_s'nin aksinebsearch_s, dizinin sıralanması gerekmez. base Bağımsız değişken, aranacak dizinin tabanına işaret eden bir işaretçidir. compare Bağımsız değişken, iki dizi öğesini karşılaştıran ve ardından ilişkilerini belirten bir değer döndüren, kullanıcı tarafından sağlanan bir yordama yönelik bir işaretçidir. _lfind_s , her çağrıda işaretçiyi compare ve işaretçileri iki dizi öğesine geçirerek context , arama sırasında yordamı bir veya daha fazla kez çağırır. Yordamın compare öğeleri karşılaştırması ve ardından sıfır olmayan (öğelerin farklı olduğu anlamına gelir) veya 0 (öğelerin aynı olduğu anlamına gelir) döndürmesi gerekir.

_lfind_s , _lfind işaretçinin karşılaştırma işlevinin context bağımsız değişkenlerine eklenmesi ve işlevin parametre listesi dışında benzerdir. İşaretçi context , aranan veri yapısı bir nesnenin parçasıysa ve işlevin compare nesnenin üyelerine erişmesi gerekiyorsa yararlı olabilir. compare işlevi void işaretçisini uygun nesne türüne dönüştürebilir ve bu nesnenin üyelerine erişebilir. Parametrenin context eklenmesi daha güvenli hale gelir _lfind_s çünkü verileri işlev için kullanılabilir hale getirmek için statik değişkenlerin kullanılmasıyla ilişkili yeniden giriş hatalarını önlemek için compare ek bağlam kullanılabilir.

Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bu davranışı değiştirmek için bkz. CRT'de Genel durum.

Gereksinimler

Yordam Gerekli başlık
_lfind_s <search.h>

Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Örnek

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

Ayrıca bkz.

Arama ve sıralama
bsearch_s
_lsearch_s
qsort_s
_lfind