Listing 3 Sorts structures first by name, then age

/* sort3.c: Sort structures */

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

#define NELEMS 4

struct person
{
   char last[16];
   char first[11];
   char phone[13];
   int age;
};

static int name_comp(const void *, const void *);
static int age_comp(const void *, const void *);

main()
{
   size_t i;
   static struct person some_people[NELEMS] =
     {{"Lincoln","Abraham","555-1865",161},
      {"Ford","Henry",#555-1903",98},
      {"Ford","Edsel","555-1965",53},
      {"Trump","Donald","555-1988",49}};

   qsort(some_people, NELEMS, sizeof some_people[0],
        name_comp);

   puts("By name:");
   for (i = 0; i < NELEMS; ++i)
      printf("%s, %s, %s %d\n",
        some_people[i].last,
        some_people[i].first,
        some_people[i].phone,
        some_people[i].age);

   qsort(some_people, NELEMS, sizeof some_people[0],
        age_comp);

   puts("\nBy age:");
   for (i = 0; i < NELEMS; ++i)
      printf("%s, %s, %s %d\n",
        some_people[i].last,
        some_people[i].first,
        some_people[i].phone,
        some_people[i].age);
   return 0;
}

static int name_comp(const void *p1, const void *p2)
{
   struct person *sp1 = (struct person *) p1;
   struct person *sp2 = (struct person *) p2;
   int order = strcmp(sp1->last,sp2->last);

   if (order == 0)
      order= strcmp(sp1->first,sp2->first);
   return order;
}

static int age_comp(const void *p1, const void *p2)
{
   struct person *sp1 = (struct person *) p1;
   struct person *sp2 = (struct person *) p2;

   return sp1->age - sp2->age;
}

/* Output:
By name:
Ford, Edsel, 555-1965 53
Ford, Henry, 555-1903 98
Lincoln, Abraham, 555-1865 161
Trump, Donald, 555-1988 49

By age:
Trump, Donald, 555-1988 49
Ford, Edsel, 555-1965 53
Ford, Henry 555-1903 98
Lincoln, Abraham, 555-1865 161
*/
/* End of File */