bsearch_s
Sıralanmış bir dizide ikili arama gerçekleştirir. Bu işlev, CRT'deki Güvenlik özellikleri bölümünde açıklandığı gibi güvenlik geliştirmeleri içeren bir sürümüdürbsearch
.
Sözdizimi
void *bsearch_s(
const void *key,
const void *base,
size_t number,
size_t width,
int ( __cdecl *compare ) ( void *, const void *key, const void *datum),
void * context
);
Parametreler
key
Aranacak anahtarın işaretçisi.
base
Arama verilerinin tabanına işaret eden işaretçi.
number
Öğe sayısı.
width
Öğelerin genişliği.
compare
İki öğeyi karşılaştıran geri çağırma işlevi. İlk bağımsız değişken işaretçidir context
. İkinci bağımsız değişken, arama için işaretçidir key
. Üçüncü bağımsız değişken, ile key
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
bsearch_s
tarafından işaret edilen dizideki örneğine key
base
yönelik bir işaretçi döndürür. bulunamazsa key
işlevi döndürür NULL
. Dizi artan sıralama düzeninde değilse veya aynı anahtarlara sahip yinelenen kayıtlar içeriyorsa, sonuç tahmin edilemez.
İşleve geçersiz parametreler geçirilirse, Parametre doğrulama bölümünde açıklandığı gibi geçersiz parametre işleyicisini çağırır. Yürütmenin devam etmesi için izin verilirse, errno
olarak ayarlanır EINVAL
ve işlevi döndürür NULL
. Daha fazla bilgi için bkz. errno
, _doserrno
, _sys_errlist
ve _sys_nerr
.
Hata koşulları
key |
base |
compare |
number |
width |
errno değer |
---|---|---|---|---|---|
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 | = 0 | EINVAL |
herhangi bir | herhangi bir | NULL |
an | herhangi bir | EINVAL |
Açıklamalar
bsearch_s
işlevi, her biri bayt boyutunda sıralanmış bir öğe dizisi number
için width
ikili arama gerçekleştirir. base
Değer, aranacak dizinin tabanına işaret eden bir işaretçidir ve key
aranan değerdir. compare
parametresi, istenen anahtarı bir dizi öğesiyle karşılaştıran ve ilişkilerini belirten aşağıdaki değerlerden birini döndüren kullanıcı tarafından sağlanan yordamın işaretçisidir:
Yordam tarafından compare döndürülen değer |
Açıklama |
---|---|
< 0 | Anahtar dizi öğesinden küçük. |
0 | Anahtar dizi öğesine eşittir. |
> 0 | Anahtar, dizi öğesinden büyüktür. |
İşaretçi context
, aranan veri yapısı bir nesnenin parçasıysa ve compare işlevinin 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 bsearch_s
, çünkü bağlam, 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
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 |
---|---|
bsearch_s |
<stdlib.h> ve <search.h> |
Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.
Örnek
Bu program ile qsort_s
bir dize dizisini sıralar ve ardından "cat" sözcüğünü bulmak için bsearch_s kullanır.
// crt_bsearch_s.cpp
// This program uses bsearch_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
#define ENGLISH_LOCALE "English_US.850"
#endif
#ifdef CODEPAGE_1252
#define ENGLISH_LOCALE "English_US.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, char **str1, char **str2)
{
char *s1 = *str1;
char *s2 = *str2;
locale& loc = *( reinterpret_cast< locale * > ( pvlocale));
return use_facet< collate<char> >(loc).compare(
s1, s1+strlen(s1),
s2, s2+strlen(s2) );
}
int main( void )
{
char *arr[] = {"dog", "pig", "horse", "cat", "human", "rat", "cow", "goat"};
char *key = "cat";
char **result;
int i;
/* Sort using Quicksort algorithm: */
qsort_s( arr,
sizeof(arr)/sizeof(arr[0]),
sizeof( char * ),
(int (*)(void*, const void*, const void*))compare,
&locale(ENGLISH_LOCALE) );
for( i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i ) /* Output sorted list */
printf( "%s ", arr[i] );
/* Find the word "cat" using a binary search algorithm: */
result = (char **)bsearch_s( &key,
arr,
sizeof(arr)/sizeof(arr[0]),
sizeof( char * ),
(int (*)(void*, const void*, const void*))compare,
&locale(ENGLISH_LOCALE) );
if( result )
printf( "\n%s found at %Fp\n", *result, result );
else
printf( "\nCat not found!\n" );
}
cat cow dog goat horse human pig rat
cat found at 002F0F04