當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C語言 bsearch用法及代碼示例


C語言stdlib頭文件(stdlib.h)中bsearch函數的用法及代碼示例。

用法:

void* bsearch (const void* key, const void* base,
               size_t num, size_t size,
               int (*compar)(const void*,const void*));
數組中的二進製搜索
搜索給定key在由指向的數組中base(由num元素,每個size個字節),並返回一個void*指向匹配元素的指針(如果找到)。

為了執行搜索,該函數對進行了一係列調用comparkey作為第一個參數和數組所指向的元素base作為第二個論點。

由於可以優化此函數以使用非線性搜索算法(大概是二進製搜索),因此比較的元素少於key使用compar應該在比較比較相等的數據之前,而在比較比較較大的數據之前。任何以相同的條件排序的陣列都可以滿足此要求compar(好像與qsort)。

參數

key
指向用作搜索關鍵字的對象的指針,type-casted指向void*
base
指向執行搜索的數組的第一個對象的指針,type-casted指向void*
num
指向的數組中的元素數base
size_t是無符號整數類型。
size
數組中每個元素的大小(以字節為單位)。
size_t是無符號整數類型。
compar
指向比較兩個元素的函數的指針。
該函數被重複調用bsearch比較key針對中的個別元素base。它應遵循以下原型:
 
int compar (const void* pkey, const void* pelem);

以兩個指針作為參數:第一個總是key,第二個指向數組的元素(兩者均為type-castedconst void*)。該函數應返回(以穩定且可傳遞的方式):
返回值意義
<0指向的元素pkey在由指向的元素之前pelem
0指向的元素pkey等效於所指向的元素pelem
>0指向的元素pkey跟隨由指向的元素pelem

對於可以使用常規關係運算符進行比較的類型,一般compar函數可能看起來像:

1
2
3
4
5
6
int compareMyType (const void * a, const void * b)
{
  if ( *(MyType*)a <  *(MyType*)b ) return -1;
  if ( *(MyType*)a == *(MyType*)b ) return 0;
  if ( *(MyType*)a >  *(MyType*)b ) return 1;
}


返回值

指向數組中與搜索匹配的條目的指針key。如果有多個匹配元素(即,compar會回來0),則可能指向其中任何一個(不一定是第一個)。
如果key找不到,則返回空指針。

示例

/* bsearch example */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort, bsearch, NULL */

int compareints (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

int values[] = { 50, 20, 60, 40, 10, 30 };

int main ()
{
  int * pItem;
  int key = 40;
  qsort (values, 6, sizeof (int), compareints);
  pItem = (int*) bsearch (&key, values, 6, sizeof (int), compareints);
  if (pItem!=NULL)
    printf ("%d is in the array.\n",*pItem);
  else
    printf ("%d is not in the array.\n",key);
  return 0;
}


在這個例子中compareints比較兩個參數所指向的值,如下所示:int值,並返回減去其指向值的結果,從而得出0如果它們相等,則結果為正,如果所指向的值為正,則結果為正。a大於b或否定結果(如果由指向的值)b更偉大。

在主函數中,目標數組與qsort調用之前bsearch搜索值。

輸出:
40 is in the array.

對於C字符串,strcmp可以直接用作compar爭辯bsearch
/* bsearch example with strings */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort, bsearch, NULL */
#include <string.h>     /* strcmp */

char strvalues[][20] = {"some","example","strings","here"};

int main ()
{
  char * pItem;
  char key[20] = "example";

  /* sort elements in array: */
  qsort (strvalues, 4, 20, (int(*)(const void*,const void*)) strcmp);

  /* search for the key: */
  pItem = (char*) bsearch (key, strvalues, 4, 20, (int(*)(const void*,const void*)) strcmp);

  if (pItem!=NULL)
    printf ("%s is in the array.\n",pItem);
  else
    printf ("%s is not in the array.\n",key);
  return 0;
}


輸出:
example is in the array.




相關用法


注:本文由純淨天空篩選整理自C標準庫大神的英文原創作品 C bsearch function。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。