Aracılığıyla paylaş


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

Ayrıca bkz.

Arama ve sıralama
_lfind
_lsearch
qsort