¡Buenas!
En la función que comprueba la corrección de una fecha tienes un error muy gordo de lógica en el caso de febrero:
else if (pFecha->mes == 2)
{
if ((bis = 1) && (pFecha->dia > 29))
compru = 0;
else if ((bis = 0) && (pFecha->dia > 28))
compru = 0;
}
29/2/1992 (año bisiesto):
- bis = 1: true dia> 29: false --> pasamos al else
- bis = 0: false --> pasamos al else ---> ¡NO HAY ELSE! ---> compru queda indefinido.
Supongo que tu intención no era asignar valores uno o cero a bis, sino asignar el valor de la función que evalúa si un año es o no bisiesto. Por cierto, asigna a compru el valor 1 desde el principio, ya que en tu código estás buscando los casos de error y has visto que al menos en el caso de febrero su valor queda indefinido.
Por cierto, en una función que compruebe cosas sobre datos,
nunca imprimas mensajes ni pidas datos. No hagas ninguna de las dos cosas porque no sabes la interfaz que va a tener tu programa, lo mismo puede ser un entrono de ventanas que de consola que ser un código empotrado en algún sistema... si una función comprueba la validez de unos datos, si quieres indicar que algo ha salido mal, devuelve datos numéricos que indiquen el error. Así la función que haya llamado a la función de comprobación podrá saber si algo ha salido mal, y actuar en consecuencia.
¡Saludos!