Hola JonatanP lo que hice yo para la solución fue convertir las fechas a días y luego realizar una resta y reconvertir a años, meses y días, también re hice el ejercicio desde cero dado que tu código no se puede leer bien...

NOTA: La fecha es aproximadas, por lo que se requiere trabajar más en el código si se quiere una fecha de distancia exacta...

#include <stdio.h>
#include <math.h>
enum
{
ENERO=1,
FEBRERO,
MARZO,
ABRIL,
MAYO,
JUNIO,
JULIO,
AGOSTO,
SEPTIEMBRE,
OCTUBRE,
NOVIEMBRE,
DICIEMBRE,
};
int VerificarDia(int dia,int mes)
{
int verificar;
if((mes==FEBRERO)&&(dia>=1)&&(dia<=28))
return 1;
switch(mes)
{
case ENERO:
case MARZO:
case MAYO:
case JULIO:
case AGOSTO:
case OCTUBRE:
case DICIEMBRE:
verificar=((dia>=1)&&(dia<=31));
break;
default:
verificar=((dia>=1)&&(dia<=30));
break;
}
return verificar;
}
int VerificarMes(int mes)
{
return((mes>=1)&&(mes<=12));
}
int VerificarAnio(int anio)
{
return((anio>=1900)&&(anio<=2020));
}
int VerificarFecha(int*dia,int*mes,int*anio)
{
printf("La fecha es: %i:%i:%i\n",*dia
,*mes
,*anio
); if(VerificarAnio(*anio))
if(VerificarMes(*mes))
if(VerificarDia(*dia,*mes))
return 1;
return 0;
}
int AnioADias(int anio)
{
return ((anio)*(7*31+1*28+4*30));
}
int MesADias(int mes)
{
return (mes*30);//Valor aproximado
}
int DiasAAnios(int dias)
{
return (dias/(7*31+1*28+4*30));
}
int DiasAMeses(int dias)
{
return (dias/30);//Valor aproximado
}
int main()
{
int dia, mes, anio;
int fechaValida; // bool
do
{
fechaValida=VerificarFecha(&dia, &mes, &anio);
if(!fechaValida)
puts("Fecha Invalida!!!\n"); } while (!fechaValida);
int veintiuno_mayo_2020=AnioADias(2020)+MesADias(MAYO)+21;
int fechaSeleccionada=AnioADias(anio)+MesADias(mes)+dia;
int diferenciaDeFecha
=abs(veintiuno_mayo_2020
-fechaSeleccionada
);
printf("Hay %i años, %i meses y %i dias de diferencia...\n", DiasAAnios(diferenciaDeFecha),
abs(DiasAMeses
(diferenciaDeFecha
)-(DiasAAnios
(diferenciaDeFecha
)*12)), abs(diferenciaDeFecha
-(DiasAMeses
(diferenciaDeFecha
)*30))); }
B#