Ya se ha indicado en comentarios y en la respuesta de eferion que el detonante de tu fallo es usar mal la función scanf
. Me uno al consejo del resto de usuarios al recomendarte que leas el manual de dicha función; sin embargo saber dónde falla el programa no explica por qué falla. La explicación es algo compleja.
La función scanf
forma parte de las librerías de c y por ello sigue las normas del lenguaje C en su funcionamiento; una de las limitaciones de este lenguaje es la ausencia de referencias1 y esta limitación hace que para modificar una variable fuera de su ámbito sea necesario pasar la dirección de memoria de la misma.
Dado que has pasado "%i"
como formato de lectura, la función scanf
esperará escribir en un entero (int
) y por ello asume que recibirá un puntero a entero. Insisto en el concepto de que scanf
asume que recibirá un puntero a entero, esta función (de las librerías de C) no tiene manera de comprobar que el tipo de dato facilitado coincida con el tipo de dato esperado2 y por ello asume que lo va a ser; es trabajo del programador asegurar que se cumpla esta precondición3.
En tu código, fallaste en tu responsabilidad como programador de asegurar la precondición esperada por scanf
, así que asumió que el entero que estabas pasando como parámetro era un puntero a entero. En tu código podemos ver que no inicializas la variable dia
, según las normas de inicialización de C++ ésto dejará dicha variable con un valor indeterminado y ese valor será lo que scanf
interprete como una dirección de memoria que al intentar escribir en ella se producirá una violación de segmento y el sistema operativo te informará de que tu programa.exe ha dejado de funcionar.
- Puedes conocer la diferencia entre puntero y referencia en este hilo.
- En otras palabras: no puede garantizar la seguridad de los tipos.
- Por estos motivos la función
scanf
se considera como poco segura, propensa a errores y un posible agujero de seguridad en el sistema, incluso existen tutoriales para sacar provecho de las vulnerabilidades que provoca la función scanf
. Por ello en C++ se desaconseja su uso y en C se aconseja usar alternativas seguras como sscanf
(s
ecure scanf
).