0

Fixed.

include

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);
}

As you can see I have put what I think is correct to call bsearch, however if it is right i'm not sure where to go from here.

alk
  • 69,737
  • 10
  • 105
  • 255
Mike
  • 109
  • 2
  • 10

1 Answers1

1

If you're searching for a specific date, then use a struct date as a key:

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

Then you can use your sortDates function (you should rename it to 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 */
);

See also http://www.cplusplus.com/reference/clibrary/cstdlib/bsearch/ and http://en.cppreference.com/w/cpp/algorithm/bsearch for further examples.

Zeta
  • 103,620
  • 13
  • 194
  • 236
  • No need to cast the return value of `bsearch`; a `void*` can be implicitly converted to any other pointer type and an explicit cast may hide subtle bugs. – Fred Foo Mar 09 '12 at 14:08
  • @larsmans: Oops - just c&p his code and replaced `char*` with `struct date*`. Changed it. – Zeta Mar 09 '12 at 14:10