bsearch_s
bsearch, bsearch_s
在头文件 | | |
---|---|---|
void * bsearch(const void * key,const void * ptr,size_t count,size_t size,int(* comp)(const void *,const void *)); | (1) | |
void * bsearch_s(const void * key,const void * ptr,rsize_t count,rsize_t size,int(* comp)(const void *,const void *,void *),void * context); | (2) | (自C11以来) |
1)查找与指向key
的数组中指向的元素相等的元素ptr
。该数组包含字节的count
元素,size
并且必须相对于key
该元素进行分区,也就是说,比较的所有元素必须出现在所有比较相同的元素之前,并且这些元素必须出现在所有比该关键对象更大的元素之前。完全排序的数组满足这些要求。元素使用指向的函数进行比较comp
。如果数组尚未*key
按照与使用相同的标准升序进行分区,则行为未定义comp
。
2)与(1)相同,只是context
传递附加上下文参数,comp
并且在运行时检测到以下错误并调用当前安装的约束处理函数:
count
或size
大于RSIZE_MAX
与所有边界检查的函数一样,bsearch_s
只有__STDC_LIB_EXT1__
在实现定义并且用户在包含之前定义__STDC_WANT_LIB_EXT1__
为整数常量时1
才能保证可用stdlib.h
。
If the array contains several elements that comp
would indicate as equal to the element searched for, then it is unspecified which element the function will return as the result.
Parameters
键 | - | 指向要搜索的元素的指针 |
---|---|---|
ptr | - | 指向要检查的数组的指针 |
count | - | 数组中元素的个数 |
size | - | 数组中每个元素的大小(以字节为单位) |
comp | - | 比较函数,如果第一个参数小于第二个参数,则返回负整数值;如果第一个参数大于第二个参数,则返回正整数值;如果参数相等,则返回零。键作为第一个参数传递,数组中的元素作为第二个参数。比较函数的签名应该等同于以下内容:int cmp(const void * a,const void * b); 该函数不得修改传递给它的对象,并且在调用相同对象时必须返回一致的结果,而不管它们在数组中的位置。 |
context | - | 附加信息(例如,整理顺序),作为第三个参数传递给comp |
返回值
1)指向数组中等于*key
或等于的元素的指针,或者如果尚未找到此元素,则返回空指针。
2)与(1)相同,只是空指针在运行时约束违规时也返回。
注意
尽管名称不同,C或POSIX标准都不要求使用二进制搜索来实现此功能,也不需要进行任何复杂性保证。
与其他边界检查函数不同,bsearch_s
不会将零大小的数组视为运行时约束违规,而是指示找不到元素(另一个接受零大小数组的函数qsort_s
)。
直到bsearch_s
,用户bsearch
经常使用的全局变量传递附加的上下文的比较功能。
示例
#include <stdlib.h>
#include <stdio.h>
struct data {
int nr;
char const *value;
} dat[] = {
{1, "Foo"}, {2, "Bar"}, {3, "Hello"}, {4, "World"}
};
int data_cmp(void const *lhs, void const *rhs)
{
struct data const *const l = lhs;
struct data const *const r = rhs;
if (l->nr < r->nr) return -1;
else if (l->nr > r->nr) return 1;
else return 0;
// return (l->nr > r->nr) - (l->nr < r->nr // possible shortcut
// return l->nr - r->nr; // erroneous shortcut (fails if INT_MIN is present)
}
int main(void)
{
struct data key = { .nr = 3 };
struct data const *res = bsearch(&key, dat, sizeof dat / sizeof dat[0],
sizeof dat[0], data_cmp
if (res) {
printf("No %d: %s\n", res->nr, res->value
} else {
printf("No %d not found\n", key.nr
}
}
输出:
No 3: Hello
参考
- C11标准(ISO / IEC 9899:2011):
也可以看看
qsortqsort_s(C11) | 对一系列未指定类型的元素进行排序(函数) |
---|
| C++ documentation for bsearch |