Vedi innanzi tutto
questo thread per evitare inutili contorsionismi con i cast nella compare UDF, che risultano sicuramente
error-prone.
Sebbene gli stessi Kernighan & Ritchie si dichiarino apertamente poco entusiasti di tale typedef, esso risulta enormemente diffuso in una mole gigantesca di codice C89 (e oltre) del real world e facilita notevolmente la lettura, venendo pertanto privilegiato in numerose coding guides.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
#define MAX_LEN_NAME 50
typedef struct
{
char nome[MAX_LEN_NAME + 1];
char cognome[MAX_LEN_NAME + 1];
int age;
} Tpersona;
typedef int (*fptr)(const void*, const void*);
int agecmp(Tpersona *a, Tpersona *b)
{
return (a->age - b->age);
}
int namecmp(Tpersona *a, Tpersona *b)
{
return (strcmp(a->cognome, b->cognome));
}
int main(void)
{
Tpersona vettore[N];
int i;
for (i = 0; i < N; i++)
{
printf("nome ");
scanf("%s", vettore[i].nome);
printf("cognome ");
scanf("%s", vettore[i].cognome);
printf("età ");
scanf("%d", &vettore[i].age);
printf("------------\n");
}
qsort(vettore, N, sizeof(Tpersona), (fptr)agecmp);
for (i = 0; i < N; i++)
{
printf("%d: %s %s\n",
vettore[i].age,
vettore[i].nome,
vettore[i].cognome);
}
puts("****************************************");
qsort(vettore, N, sizeof(Tpersona), (fptr)namecmp);
for (i = 0; i < N; i++)
{
printf("%s %s, %d\n",
vettore[i].cognome,
vettore[i].nome,
vettore[i].age);
}
return 0;
}