?
This document uses PHP Chinese website manual Release
在頭文件<stdlib.h>中定義 | ||
---|---|---|
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
。該數組包含字節(jié)的count
元素,size
并且必須相對于key
該元素進行分區(qū),也就是說,比較的所有元素必須出現在所有比較相同的元素之前,并且這些元素必須出現在所有比該關鍵對象更大的元素之前。完全排序的數組滿足這些要求。元素使用指向的函數進行比較comp
。如果數組尚未*key
按照與使用相同的標準升序進行分區(qū),則行為未定義comp
。
2)與(1)相同,只是context
傳遞附加上下文參數,comp
并且在運行時檢測到以下錯誤并調用當前安裝的約束處理函數:
count
或size
大于RSIZE_MAX
key
,ptr
或者comp
是一個空指針(除非count
是零)
與所有邊界檢查的函數一樣,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.
鍵 | - | 指向要搜索的元素的指針 |
---|---|---|
ptr | - | 指向要檢查的數組的指針 |
count | - | 數組中元素的個數 |
size | - | 數組中每個元素的大?。ㄒ宰止?jié)為單位) |
comp | - | 比較函數,如果第一個參數小于第二個參數,則返回負整數值;如果第一個參數大于第二個參數,則返回正整數值;如果參數相等,則返回零。鍵作為第一個參數傳遞,數組中的元素作為第二個參數。比較函數的簽名應該等同于以下內容:int cmp(const void * a,const void * b); 該函數不得修改傳遞給它的對象,并且在調用相同對象時必須返回一致的結果,而不管它們在數組中的位置。 |
context | - | 附加信息(例如,整理順序),作為第三個參數傳遞給comp |
1)指向數組中等于*key
或等于的元素的指針,或者如果尚未找到此元素,則返回空指針。
2)與(1)相同,只是空指針在運行時約束違規(guī)時也返回。
盡管名稱不同,C或POSIX標準都不要求使用二進制搜索來實現此功能,也不需要進行任何復雜性保證。
與其他邊界檢查函數不同,bsearch_s
不會將零大小的數組視為運行時約束違規(guī),而是指示找不到元素(另一個接受零大小數組的函數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):
7.22.5.1 bsearch函數(p:355)
K.3.6.3.1 bsearch_s函數(p:608-609)
C99標準(ISO / IEC 9899:1999):
7.20.5.1 bsearch函數(p:318-319)
C89 / C90標準(ISO / IEC 9899:1990):
4.10.5.1 bsearch函數
qsortqsort_s(C11) | 對一系列未指定類型的元素進行排序(函數) |
---|
| C++ documentation for bsearch |