Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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