Si scriva un programma in linguaggio C che gestisca i dati relativi ai risultati di una gara di atletica
leggera. Il programma, noto il numero di partecipanti alla gara, deve:
a) allocare dinamicamente un vettore, nel quale ogni elemento rappresenta il risultato di un
diverso atleta;
b) Per ogni atleta e` necessario memorizzare:
pettorale (intero): rappresenta il numero di pettorale dell'atleta iscritto alla gara;
cognome (max 21caratteri);
nome (max 21caratteri);
specialità (max 7 caratteri): (es.: 1500m, 100m, 400m hs);
tempo personale (intero): rappresenta il tempo in secondi (se questo valore e` uguale a 1,
significa che l'atleta si è ritirato durante la gara.
Una volta acquisiti i dati relativi alla gara, il programma deve:
1. Visualizzare la graduatoria finale della competizione ( in ordine di tempo totale
crescente) con, per ogni atleta cognome, nome, numero e tempo.
2. Visualizzare cognome, nome, numero e tempo del vincitore.
3. Visualizzare cognome, nome e numero degli atleti ritirati;

Allora il programma è quasi completo, manca solo la parte che visualizza la graduatoria finale in ordine di tempo. Come si fa? Poi un'altra cosa: perchè quando mi visualizza il vincitore il nome e il cognome si vedono tutti a caratteri strani? Dove ho sbagliato?

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

typedef struct{
int pettorale;
char cognome[21];
char nome[21];
char specialita[7];
int tempo;
}partecipante;

main()
{
      
int n, i, pm, tm;
char cm[21], nm[21];
partecipante *p; 

do{     
printf("Quanti partecipanti? ");
scanf("%d", &n);

p=(partecipante *) malloc (sizeof(partecipante) * n);

for(i=0;i<n;i++)
{
                printf("\nAtleta numero %d", i+1);
                printf("\n\nNumero di pettorale: ");
                scanf("%d", &p[i].pettorale);
                printf("\nCognome: ");
                scanf("%s", p[i].cognome);
                printf("\nNome: ");
                scanf("%s", p[i].nome);
                printf("\nSpecialita': ");
                scanf("%s", p[i].specialita);
                printf("\nTempo: ");
                scanf("%d", &p[i].tempo);
}

printf("\n\nRITIRATI:\n\n");

for(i=0;i<n;i++)
{
                if(p[i].tempo == -1)
                printf("%s---%s---%d\n\n", p[i].cognome, p[i].nome, p[i].pettorale);
}

printf("VINCITORE:\n\n");

tm=p[0].tempo;

for(i=0;i<n;i++)
{
                if(p[i].tempo < tm && p[i].tempo != -1)
                {
                strcpy(p[i].cognome, cm);
                strcpy(p[i].nome, nm);
                pm=p[i].pettorale;
                tm=p[i].tempo;
                }
                
}
printf("%s---%s---%d---%d\n\n", cm, nm, pm, tm);

}while(n);
}