bsearch_sbsearch_s

並べ替えられた配列のバイナリ検索を実行します。Performs a binary search of a sorted array. この関数は、「 CRT のセキュリティ機能」の説明にあるとおり、セキュリティが強化されたバージョンのbsearchです。This function is a version of bsearch with security enhancements as described in Security features in the CRT.

構文Syntax

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

パラメーターParameters

レジストリkey
検索するキーへのポインター。Pointer to the key to search for.

常用base
検索データのベースへのポインター。Pointer to the base of the search data.

少数number
要素の数。Number of elements.

width
要素の幅。Width of elements.

対照compare
2 つの要素を比較するコールバック関数。Callback function that compares two elements. 最初の引数はコンテキストポインターです。The first argument is the context pointer. 2番目の引数は、検索用のキーへのポインターです。The second argument is a pointer to the key for the search. 3番目の引数は、キーと比較する配列要素へのポインターです。The third argument is a pointer to the array element to be compared with key.

関連context
比較関数内でアクセスできるオブジェクトへのポインター。A pointer to an object that can be accessed in the comparison function.

戻り値Return value

bsearch_sは、 baseが指す配列内のキーの出現箇所へのポインターを返します。bsearch_s returns a pointer to an occurrence of key in the array pointed to by base. Keyが見つからない場合、関数はNULLを返します。If key is not found, the function returns NULL. 配列が昇順でないか、同一キーで重複するレコードがある場合、結果は予測不可能になります。If the array is not in ascending sort order or contains duplicate records with identical keys, the result is unpredictable.

無効なパラメーターが関数に渡されると、「パラメーターの検証」で説明されているように、無効なパラメーターハンドラーが呼び出されます。If invalid parameters are passed to the function, it invokes the invalid parameter handler as described in Parameter Validation. 実行の継続が許可された場合、 errnoEINVALに設定され、関数はNULLを返します。If execution is allowed to continue, errno is set to EINVAL and the function returns NULL. 詳細については、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。For more information, see errno, _doserrno, _sys_errlist, and _sys_nerr.

エラー条件Error conditions

keykey basebase 対照compare numbernumber widthwidth errnoerrno
空白NULL anyany anyany anyany anyany EINVALEINVAL
anyany 空白NULL anyany != 0!= 0 anyany EINVALEINVAL
anyany anyany anyany anyany = 0= 0 EINVALEINVAL
anyany anyany 空白NULL 1 つan anyany EINVALEINVAL

解説Remarks

Bsearch_s関数は、数値要素の並べ替えられた配列のバイナリ検索を実行します。これにはサイズのバイトが含まれます。The bsearch_s function performs a binary search of a sorted array of number elements, each of width bytes in size. ベース値は、検索対象の配列のベースへのポインターであり、キーは検索対象の値です。The base value is a pointer to the base of the array to be searched, and key is the value being sought. Compareパラメーターは、ユーザーが指定したルーチンへのポインターであり、要求されたキーを配列要素と比較し、次のいずれかの値を返します。The compare parameter is a pointer to a user-supplied routine that compares the requested key to an array element and returns one of the following values specifying their relationship:

比較ルーチンによって返される値Value returned by compare routine 説明Description
< 0< 0 キーは配列要素より小さい。Key is less than array element.
00 キーは配列要素と等しい。Key is equal to array element.
> 0> 0 キーは配列要素より大きい。Key is greater than array element.

コンテキストポインターは、検索対象のデータ構造体がオブジェクトの一部であり、compare 関数がオブジェクトのメンバーにアクセスする必要がある場合に便利です。The context pointer may be useful if the searched data structure is part of an object, and the compare function needs to access members of the object. Compare関数は、void ポインターを適切なオブジェクト型にキャストし、そのオブジェクトのメンバーにアクセスすることができます。The compare function may cast the void pointer into the appropriate object type and access members of that object. コンテキストパラメーターを追加することにより、 bsearch_sのセキュリティが強化されます。これは、比較関数でデータを使用できるようにするために静的変数を使用する場合に関連する再入バグを回避するために、追加のコンテキストが使用されるためです。The addition of the context parameter makes bsearch_s more secure since additional context may be used to avoid reentrancy bugs associated with using static variables to make data available to the compare function.

既定では、この関数のグローバル状態はアプリケーションにスコープが設定されています。By default, this function's global state is scoped to the application. これを変更するには、「 CRT でのグローバル状態」を参照してください。To change this, see Global state in the CRT.

必要条件Requirements

ルーチンRoutine 必須ヘッダーRequired header
bsearch_sbsearch_s <stdlib.h > と <search.h ><stdlib.h> and <search.h>

互換性の詳細については、「互換性」を参照してください。For additional compatibility information, see Compatibility.

Example

このプログラムでは、qsort_s で文字列の配列を並べ替え、bsearch_s を使用して "cat" という単語を検索します。This program sorts a string array with qsort_s, and then uses bsearch_s to find the word "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

関連項目See also

検索と並べ替えSearching and Sorting
_lfind_lfind
_lsearch_lsearch
qsortqsort