Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 keykarşı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 baseyö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_errlistve _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_sbir 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