Поделиться через


bsearch

Выполняет двоичный поиск по отсортированному массиву. Доступна более безопасная версия этой функции; см. раздел bsearch_s.

Синтаксис

void *bsearch(
   const void *key,
   const void *base,
   size_t num,
   size_t width,
   int ( __cdecl *compare ) (const void *key, const void *datum)
);

Параметры

key
Указатель на ключ для поиска.

base
Указатель на базу данных поиска.

number
Число элементов.

width
Ширина элементов.

compare
Функция обратного вызова, которая сравнивает два элемента. Первый — указатель на ключ для поиска, а второй — указатель на элемент массива, который будет сравниваться с ключом.

Возвращаемое значение

bsearch возвращает указатель на вхождение key в массиве, на который указывает base. Если key функция не найдена, функция возвращается NULL. Если массив не находится в порядке сортировки по возрастанию или содержит повторяющиеся записи с идентичными ключами, результат непредсказуем.

Замечания

Функция bsearch выполняет двоичный поиск по отсортированному массиву, состоящему из number элементов размером width байт каждый. Значение base — это указатель на начало массива, в котором должен производиться поиск, а key — искомое значение. Параметр compare — это указатель на определяемую пользователем подпрограмму, которая сравнивает запрошенный ключ с элементом массива. Он возвращает одно из следующих значений, которые указывают их связь:

Значение, возвращаемое подпрограммой compare Description
< 0 Ключ меньше, чем элемент массива.
0 Ключ равен элементу массива.
> 0 Ключ больше, чем элемент массива.

Эта функция проверяет свои параметры. Значение < key a0/number>numberNULLNULLbase, если compareоно ненулевое или width равно нулю, функция вызывает обработчик недопустимых параметров, как описано в разделе "Проверка параметров". Если выполнение может быть продолжено, для errno задается значение EINVAL , и функция возвращает значение NULL.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.

Требования

Маршрут Обязательный заголовок
bsearch <stdlib.h> и <search.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

Программа сортирует массив строк с помощью qsort, а затем использует bsearch для поиска слова "cat".

// crt_bsearch.c
#include <search.h>
#include <string.h>
#include <stdio.h>

int compare( char **arg1, char **arg2 )
{
   /* Compare all of both strings: */
   return _strcmpi( *arg1, *arg2 );
}

int main( void )
{
   char *arr[] = {"dog", "pig", "horse", "cat", "human", "rat", "cow", "goat"};
   char **result;
   char *key = "cat";
   int i;

   /* Sort using Quicksort algorithm: */
   qsort( (void *)arr, sizeof(arr)/sizeof(arr[0]), sizeof( char * ), (int (*)(const
   void*, const void*))compare );

   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( (char *) &key, (char *)arr, sizeof(arr)/sizeof(arr[0]),
                              sizeof( char * ), (int (*)(const void*, const void*))compare );
   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

См. также

Поиск и сортировка
_lfind
_lsearch
qsort