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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk