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 例程所返回的值 说明
< 0 键小于数组元素。
0 键等于数组元素。
> 0 键大于数组元素。

此函数验证其参数。 如果 comparekeynumberNULL,或者,如果 baseNULLnumber 不为零,亦或者,如果 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