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 |
键大于数组元素。 |
此函数验证其参数。 如果 compare
、key
或 number
为 NULL
,或者,如果 base
为 NULL
且 number
不为零,亦或者,如果 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