当前位置: C语言 -- 附录 -- bsearch_s

bsearch_s函数


概要:
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdlib.h>
void *bsearch_s(const void *key, const void *base, rsize_t nmemb, rsize_t size,
      int (*compar)(const void *k, const void *y, void *context),
      void *context);

描述:

该函数在nmemb个元素的数组中搜索与参数key指向对象相匹配的元素,参数base指向数组的初始元素。单个数组元素的大小由参数size指定。

参数compar指向的比较函数存在三个参数:第一个参数是bsearch_s函数的参数key;第二个参数是指向数组元素的指针;第三个参数是bsearch_s函数的参数context。如果参数key指向对象大于、小于或者等于数组元素,比较函数将返回一个大于、小于或者等于0的整数。数组中所有元素按从小到大的顺序排列(实际上这意味着整个数组已经根据比较函数进行了排序。)。

参数context对于bsearch_s函数的唯一用处是传递给比较函数用作第三个参数;比较函数执行时,该参数提供附加信息,例如:指定比较函数使用的排序序列(collating sequence)。


运行约束:

参数nmemb和参数size不能大于宏RSIZE_MAX。如果参数nmemb不等于0,参数keybasecompar不能是空指针。

如果存在运行约束冲突,bsearch_s函数不会搜索数组。


参数:
const void *key

指向搜索对象的指针。

const void *base

指向数组初始元素的指针。

rsize_t nmemb

数组长度。

rsize_t size

单个数组元素的字节数。

int (*compar)(const void *k, const void *y, void *context)

指向比较函数的指针。比较函数会被bsearch_s函数反复调用,用以比较参数key指向对象和数组元素。第一个参数总是参数key,第二个参数是指向数组元素的指针。比较函数中参数contextbsearch_s函数中参数context是相同的。

如果参数key指向对象大于、小于或者等于数组元素,比较函数将返回一个大于、小于或者等于0的整数。

void *context

传递给比较函数用作第三个参数,比较函数执行时使用,例如:指定比较函数使用的排序序列(collating sequence)。


返回值:

如果发现与参数key指向对象相匹配的元素,函数返回指向该元素的指针;如果存在多个匹配元素,ISO/IEC 9899:2018标准未明确说明匹配哪个元素。如果未发现与参数key指向对象相匹配的元素或者存在运行约束冲突,函数返回空指针。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
/*安全函数bsearch_s范例*/

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>

#define LENGTH 5

int funcCompare(void *context, const void *x, const void *y)
{
    return (*(int *)x-*(int *)y);
}

int main(void)
{
    int number[LENGTH] = {10, -5, 0, 25, 3};
    const int target = 25;

    qsort_s(number, LENGTH, sizeof(int), funcCompare, NULL);
    if(bsearch_s(&target, number, LENGTH, sizeof(int), funcCompare, NULL) != NULL)
        printf_s("%d is found.\n", target);

    return 0;
}


输出:

25 is found.

注:使用Visual Studio编译。

Visual Studioqsort_s函数和bsearch_s函数中的比较函数与ISO/IEC 9899:2018标准有差异。Visual Studio中,比较函数比较的是后两个参数的大小;ISO/IEC 9899:2018标准中,比较函数比较的是前两个参数的大小。


相关内容:
bsearch 搜索匹配数组元素的函数。
qsort_s 对数组元素进行排序的安全函数。