Bagikan melalui


bsearch_s

Melakukan pencarian biner dari array yang diurutkan. Fungsi ini adalah versi bsearch dengan peningkatan keamanan seperti yang dijelaskan dalam Fitur keamanan di CRT.

Sintaks

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

Parameter

key
Arahkan ke kunci untuk dicari.

base
Penunjuk ke dasar data pencarian.

number
Jumlah elemen.

width
Lebar elemen.

compare
Fungsi panggilan balik yang membandingkan dua elemen. Argumen pertama adalah penunjuk context . Argumen kedua adalah penunjuk ke key untuk pencarian. Argumen ketiga adalah penunjuk ke elemen array yang akan dibandingkan dengan key.

context
Penunjuk ke objek yang dapat diakses dalam fungsi perbandingan.

Nilai hasil

bsearch_s mengembalikan penunjuk ke kemunculan key dalam array yang ditujukkan oleh base. Jika key tidak ditemukan, fungsi mengembalikan NULL. Jika array tidak dalam urutan urutan naik atau berisi rekaman duplikat dengan kunci yang identik, hasilnya tidak dapat diprediksi.

Jika parameter yang tidak valid diteruskan ke fungsi, parameter tersebut memanggil handler parameter yang tidak valid seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, errno diatur ke EINVAL dan fungsi mengembalikan NULL. Untuk informasi selengkapnya, lihat errno, _doserrno, _sys_errlist, dan _sys_nerr.

Kondisi kesalahan

key base compare number width errno nilai
NULL any any any any EINVAL
any NULL any != 0 any EINVAL
any any any any =0 EINVAL
any any NULL an any EINVAL

Keterangan

Fungsi ini bsearch_s melakukan pencarian biner dari array number elemen yang diurutkan, masing-masing width byte dalam ukuran. Nilai base adalah penunjuk ke dasar array yang akan dicari, dan key merupakan nilai yang sedang dicari. Parameter compare adalah penunjuk ke rutinitas yang disediakan pengguna yang membandingkan kunci yang diminta dengan elemen array dan mengembalikan salah satu nilai berikut yang menentukan hubungan mereka:

Nilai yang dikembalikan oleh compare rutinitas Deskripsi
< 0 Kunci kurang dari elemen array.
0 Kunci sama dengan elemen array.
> 0 Kunci lebih besar dari elemen array.

Penunjuk context mungkin berguna jika struktur data yang dicari adalah bagian dari objek, dan fungsi perbandingan perlu mengakses anggota objek. Fungsi compare ini dapat mentransmisikan penunjuk ke dalam jenis objek yang sesuai dan mengakses anggota objek tersebut. Penambahan context parameter membuat bsearch_s lebih aman, karena konteks dapat digunakan untuk menghindari bug reentransi yang terkait dengan penggunaan variabel statis untuk membuat data tersedia untuk compare fungsi.

Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubah perilaku ini, lihat Status global di CRT.

Persyaratan

Rutin Header yang diperlukan
bsearch_s <stdlib.h> dan <search.h>

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Contoh

Program ini mengurutkan array string dengan qsort_s, lalu menggunakan bsearch_s untuk menemukan kata "cat".

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

Baca juga

Mencari dan mengurutkan
_lfind
_lsearch
qsort