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