62章 標準サーチ関数 bsearch

http://www.geocities.jp/ky_webid/c/062.html

bsearchとはバイナリサーチ関数です

bsearch(検索対象データ,対象配列,配列全体のサイズ,一要素のサイズ,サーチ関数ポインタ)

という定義になります。

また

さて、バイナリサーチの仕組みを知っていれば分かると思いますが、対象となる配列はあらかじめソートされていなければなりません。これはbsearch()を使う場合でも例外ではなく、bsearch()を呼び出すより前に、対象となる配列をソートしておく必要があります。もちろん、そのためにqsort()を使ってもいいです。

とあるので事前にqsort等でソート済みでなければなりません。

とりあえず書いてみます。

#include <stdio.h>
#include <stdlib.h>
#define ARRAYNUM(a) (sizeof(a)/sizeof(a[0]))

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

int main (void) {
    int num[] = {4,7,1,9,6,5,2};
    int key;
    char buf[81];
    void *result;
    
    fgets(buf,sizeof(buf),stdin);
    key = atoi(buf);
    
    qsort(num,ARRAYNUM(num),sizeof(int),cmpint);
    result = bsearch(&key,num,ARRAYNUM(num),sizeof(int),cmpint);
    
    if ( result == NULL ) {
        puts("ありませんでした");
    }
    else {
        puts("ありました");
    }
    
    return 0;
}
$ main
1
ありました

$ main
2
ありました

$ main
3
ありませんでした

scanf使ってコンパイルしたら激しく警告が出ました。今まではWallなしだったのでこれからはこういうのもちゃんと確認しながらやっていきます。

というところでとりあえずfgets使いました。