Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Выполняет двоичный поиск по отсортированному массиву. Эта функция представляет собой версию улучшений bsearch безопасности, как описано в функциях безопасности в CRT.
Синтаксис
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
);
Параметры
key
Указатель на ключ для поиска.
base
Указатель на базу данных поиска.
number
Число элементов.
width
Ширина элементов.
compare
Функция обратного вызова, которая сравнивает два элемента. Первый аргумент — это указатель context . Второй аргумент — указатель на ключ key для поиска. Третий аргумент — указатель на элемент массива, который будет сравниваться со значением key.
context
Указатель на объект, доступ к которому может получить функция сравнения.
Возвращаемое значение
bsearch_s возвращает указатель на вхождение key в массиве, на который указывает base. Если key функция не найдена, функция возвращается NULL. Если массив не находится в порядке сортировки по возрастанию или содержит повторяющиеся записи с идентичными ключами, результат непредсказуем.
Если в функцию передаются недопустимые параметры, он вызывает обработчик недопустимых параметров, как описано в разделе "Проверка параметров". Если выполнение может быть продолжено, для errno задается значение EINVAL , и функция возвращает значение NULL. Дополнительные сведения см. в разделе errno, _doserrno, _sys_errlist, и _sys_nerr.
Условия ошибок
key |
base |
compare |
number |
width |
Значение errno |
|---|---|---|---|---|---|
NULL |
любое | любое | любое | любое | EINVAL |
| любое | NULL |
любое | != 0 | любое | EINVAL |
| любое | любое | любое | любое | = 0 | EINVAL |
| любое | любое | NULL |
an | любое | EINVAL |
Замечания
Функция bsearch_s выполняет двоичный поиск по отсортированному массиву, состоящему из number элементов размером width байт каждый. Значение base — это указатель на начало массива, в котором должен производиться поиск, а key — искомое значение. Параметр compare — это указатель на предоставляемую пользователем подпрограмму, которая сравнивает заданный ключ с элементом массива и возвращает одно из следующих значений, показывающих, как соотносятся значения ключа и элемента массива:
Значение, возвращаемое подпрограммой compare |
Description |
|---|---|
| < 0 | Ключ меньше, чем элемент массива. |
| 0 | Ключ равен элементу массива. |
| > 0 | Ключ больше, чем элемент массива. |
Указатель context может быть полезен, если структура данных, в которой производится поиск, является частью объекта, и функции сравнения требуется доступ к членам этого объекта. Функция compare может привести указатель void к соответствующему типу объекта и получить доступ к членам этого объекта. Добавление context параметра делает bsearch_s более безопасным, так как контекст может использоваться для предотвращения ошибок повторного входа, связанных с использованием статических переменных, чтобы сделать данные доступными для compare функции.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Требования
| Маршрут | Обязательный заголовок |
|---|---|
bsearch_s |
<stdlib.h> и <search.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
Эта программа сортирует строковый массив, qsort_sа затем использует bsearch_s для поиска слова "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