1

とにかくこのようなことをすることはありますか?

int key=50;
int loop=5;
int array[10]={...};
int* Ptr=NULL;


qsort(array, 10, sizeof(int), compareints);


while(loop>0){
  Ptr=(int*)bsearch(&key,array,10,sizeof(int),compareints);

  if(Ptr!=NULL){
    printf("found %d", *Ptr);
  }else{
    printf("did not find %d", *Ptr);
  }
  key++;
  loop--;
}

問題はキーがインクリメントbsearchされることですが、それでも数字の 50 を検索します。キーの引数bsearchconstant pointer. 検索する前にすべてのキーが配列に格納されている場合に機能することはわかっています。ただし、これは私のアプリケーションには適していません。どんな助けでも大歓迎です。

4

1 に答える 1

1

コメントの転記 — およびデモ コードの追加。

ループの特定の反復で任意のキーを検索できるはずなので、まだ 50 を検索していると思われる理由を示す必要があります...おそらく、配列の初期化子にあるものを表示する必要がありますか? あなたのcompareints()機能が間違っている可能性がありますか?多分あなたもそれを示すべきですか?あなたの「見つかりませんでした」印刷は、印刷されkeyていないはず*Ptrです。健全性のために、両方のprintf()フォーマット文字列は で終わる必要があります。\n

このコードは機能し、質問に示されているロジックを大幅に変更することはありません。

#include <stdlib.h>
#include <stdio.h>

static
int compareints(const void *v1, const void *v2)
{
    int i1 = *(int *)v1;
    int i2 = *(int *)v2;
    if (i1 < i2)
        return -1;
    else if (i1 > i2)
        return +1;
    else
        return 0;
}

int main(void)
{
    int key = 50;
    int loop = 5;
    int array[10] = { 57, 49, 50, 51, 53, 27, 60, 51, 19, 99 };
    int *ptr = NULL;

    for (int i = 0; i < 10; i++)
        printf("%3d", array[i]);
    putchar('\n');
    qsort(array, 10, sizeof(int), compareints);
    for (int i = 0; i < 10; i++)
        printf("%3d", array[i]);
    putchar('\n');

    while (loop > 0)
    {
        printf("seeking key %d: ", key);
        ptr = (int *)bsearch(&key, array, 10, sizeof(int), compareints);

        if (ptr != NULL)
            printf("found %d\n", *ptr);
        else
            printf("did not find %d\n", key);
        key++;
        loop--;
    }
    return 0;
}

出力例:

 57 49 50 51 53 27 60 51 19 99
 19 27 49 50 51 51 53 57 60 99
seeking key 50: found 50
seeking key 51: found 51
seeking key 52: did not find 52
seeking key 53: found 53
seeking key 54: did not find 54
于 2013-09-09T13:34:10.010 に答える