Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct person
{
char name[32];
int num;
};
int cmp_name(const void *a, const void *b)
{
const struct person *x = a, *y = b;
return strcmp(x->name, y->name);
}
int cmp_num(const void *a, const void *b)
{
const struct person *x = a, *y = b;
return (x->num > y->num) - (x->num < y->num);
}
void display(const char *label, const struct person *p, size_t size)
{
puts(label);
for ( ; size--; ++p )
{
printf("name = \"%s\", num = %d\n", p->name, p->num);
}
putchar('\n');
}
int main(void)
{
struct person *found, key, in[] =
{
{"Fred", 7},
{"Anne", 4},
{"Paul", 3},
{"Judy", 6},
{"Jeff", 5},
{"Jose", 1},
{"Vlad", 2},
};
size_t count = sizeof in / sizeof *in; /* number of records */
display("Unsorted:", in, count);
/*
* Search for a particular 'name'. Make sure the array is sorted by 'name'.
*/
qsort(in, count, sizeof *in, cmp_name);
display("Sorted by 'name':", in, count);
strcpy(key.name, "Jeff");
printf("Searching for 'name' = \"%s\"... ", key.name);
found = bsearch(&key, in, count, sizeof *in, cmp_name);
if ( found )
{
printf("'num' = %d\n\n", found->num);
}
else
{
puts("not found.\n");
}
/*
* Search for a particular 'num'. Make sure the array is sorted by 'num'.
*/
qsort(in, count, sizeof *in, cmp_num);
display("Sorted by 'num':", in, count);
key.num = 3;
printf("Searching for 'num' = %d... ", key.num);
found = bsearch(&key, in, count, sizeof *in, cmp_num);
if ( found )
{
printf("'name' = \"%s\".\n\n", found->name);
}
else
{
puts("not found.\n");
}
return 0;
}
/* my output
Unsorted:
name = "Fred", num = 7
name = "Anne", num = 4
name = "Paul", num = 3
name = "Judy", num = 6
name = "Jeff", num = 5
name = "Jose", num = 1
name = "Vlad", num = 2
Sorted by 'name':
name = "Anne", num = 4
name = "Fred", num = 7
name = "Jeff", num = 5
name = "Jose", num = 1
name = "Judy", num = 6
name = "Paul", num = 3
name = "Vlad", num = 2
Searching for 'name' = "Jeff"... 'num' = 5
Sorted by 'num':
name = "Jose", num = 1
name = "Vlad", num = 2
name = "Paul", num = 3
name = "Anne", num = 4
name = "Jeff", num = 5
name = "Judy", num = 6
name = "Fred", num = 7
Searching for 'num' = 3... 'name' = "Paul".
*/