2012-03-09 14 views
0

固定。あなたは、私はそれが正しいことがあれば、私はどこここから行くようにしてくださいないんだけど、私はのbsearchを呼び出すことが正しいと思われるものに入れている見ることができるようにstruct内の複数の項目のbsearch

main() 
{ 
    int n; 
    int i; 
    char tempMonth[255]; //Used to store the month until checked 

    scanf("%d", &n); 

    struct date *list; 

    list = (struct date *)malloc((n * sizeof(struct date))); 

    for(i = 0; i < n; i++) 
    { 
     scanf("%s %d %d", tempMonth, &list[i].day, &list[i].year); 
     list[i].month = getMonth(tempMonth); 
    } 

    convertFullYear(list, n); 

    qsort(list, n, sizeof(struct date), (compfn)sortDates); 

    convertSmallYear(list, n); 

    for(i = 0; i < n; i++) 
    { 
     printf("%s %d %02d\n", months[list[i].month], list[i].day, list[i].year); 
    } 

    char *pos = (char*) bsearch(Jan, list, sizeof(list), sizeof(Jan), findJan); 
} 

が含まれます。

+2

サイドノート:本当に 'getMonth'をループとして書き直すべきです。 –

+0

いったん完全に機能したら、今のところそれをそのまま保ちます。 – Mike

+0

'int Jan = 0100;'これは8進定数です。 1月は64小数(無効) – wildplasser

答えて

1

あなたが特定の日付を探している場合は、キーとしてstruct dateを使用します。

struct date Jan; 
Jan.month = 0; 
Jan.year = 00; 
Jan.day = 1; 

は、その後、あなたのsortDates機能を使用することができます(compareDatesに名前を変更する必要があり):

struct date* pos = bsearch(
    &Jan, /* pointer to the structure above */ 
    list, /* pointer to your array */ 
    n, /* number of elements in your array */ 
    sizeof(struct date), /* size of each element */ 
    (compfn)sortDates /* compare function */ 
); 

さらなる例についてはhttp://www.cplusplus.com/reference/clibrary/cstdlib/bsearch/およびhttp://en.cppreference.com/w/cpp/algorithm/bsearchも参照してください。

+0

'bsearch'の戻り値をキャストする必要はありません。 'void *'は他のポインタ型に暗黙的に変換され、明示的キャストは微妙なバグを隠すかもしれません。 –

+0

@larsmans:すみません、彼のコードをC&Pして、 'char *'を 'struct date *'に置き換えました。それを変更しました。 – Zeta

関連する問題