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
>number
NULL
NULL
base
, если 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