#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_DATE 32 /* il numero massimo di date gestibili dal programma */
struct DATA { /* struttura usata per contenere una data scomponendola in g/m/a. */
char g; /* giorno, gamma 0-127 */
char m; /* mese, gamma 0-127 */
short a; /* anno, gamma 0-32767 */
}; /* 4 byte in tutto */
const char esDateStr[] =
"25/02/2015,12/05/1997,23/05/1997,18/03/2009,18/03/2009,12/03/2009";
const char *esRelStr[] = { "piu' antica", "contemporanea", "piu' recente" };
/* prototipi */
const char *LeggiData( const char *s, struct DATA *d );
int ConfrontaDate( struct DATA *d1, struct DATA *d2 );
int main() {
struct DATA date[MAX_DATE]; /* un array di strutture destinato
a contenere le date rilevate */
const char *p = esDateStr; /* un puntatore ausiliario */
int totDate = 0; /* dopo l'analisi della stringa, conterra'
la quantita' delle date rilevate */
int i; /* usato come contatore */
/* scorre la stringa rilevando una data alla volta */
for( totDate=0; *p != '\0' && totDate < MAX_DATE; ++totDate ) {
p = LeggiData( p, &date[totDate] );
}
printf( "\n La stringa con le tue date d'esempio e':\n %s\n\n", esDateStr );
/* fai quel che vuoi con le date rilevate, magari usando
ConfrontaDate() per rilevare quelle piu' o meno recenti */
for( i=0; i<totDate-1; ++i ) {
printf( " %02d/%02d/%04d e' %s di %02d/%02d/%04d\n",
date[i].g, date[i].m, date[i].a,
esRelStr[ConfrontaDate(&date[i],&date[i+1])+1],
date[i+1].g, date[i+1].m, date[i+1].a );
}
return 0;
}
/*
Analizza la stringa C "s", che si suppone sia correttamente formattata con date
nel formato giorno, mese, anno (tutti e tre esplicitati). I separatori tra le
parti della data e tra una data e l'altra possono essere qualsiasi carattere ad
esclusione dei caratteri numerici 0-9. Per verificare se i caratteri sono o non
sono numerici impiega la funzione di libreria standard "isdigit()".
*/
const char *LeggiData( const char *s, struct DATA *d ) {
d->g = atoi( s ); /* legge il giorno */
while( isdigit(*s++) ); /* passa oltre al delimitatore
che separa le parti della data */
d->m = atoi( s ); /* legge il mese */
while( isdigit(*s++) ); /* passa oltre al delimitatore
che separa le parti della data */
d->a = atoi( s ); /* legge l'anno */
while( isdigit(*s) ) ++s; /* passa oltre gli ultimi caratteri numerici */
if( *s != '\0' ) ++s; /* passa oltre all'eventuale delimitatore
usato per separare una data dall'altra */
return s; /* restituisce un puntatore alla data
successiva o alla fine della stringa */
}
/*
Confronta le due date passate in d1 e d2.
Se d1 e' piu' "antica" di d1 restituisce 1.
Se d1 e' piu' recente di d2 restituisce -1.
Se d1 e' contemporanea a d2 restituisce 0.
*/
int ConfrontaDate( struct DATA *d1, struct DATA *d2 ) {
long data1 = d1->g + d1->m*100 + d1->a*10000;
long data2 = d2->g + d2->m*100 + d2->a*10000;
return data1>data2 ? 1 : (data1<data2?-1:0);
}