[ Foro de C ]

bucle infinito do while

30-Dec-2021 16:59
Invitado (Pablo)
1 Respuestas

Dejo el código:

void pedir_datos(int *p_mes)
{
do {
printf("\nIntroduce mes (numerico): ");
scanf("%d", p_mes);

if(*p_mes>=13 || *p_mes<=0)
printf("\nEse mes no existe\n");

} while ((*p_mes<=0)||(*p_mes>=13));
}

Quiero blindar mi programa. Tal y como está, funciona, modifica correctamente la variable a la que apunta. Esta es solo una parte del código, devuelve más datos, por eso la puse de tipo void.

El caso es que me he dado cuenta de que si introduces un valor no numérico, ya sea una letra o cualquier otro caracter, el do while se convierte en un bucle infinito. Se salta el scanf y no vuelve a preguntar.

No lo entiendo, se supone que una letra tiene un valor numérico asociado según el código ASCII. Aunque estuviera fuera del rango que yo le pido, ¿por qué se salta el scanf entonces tras mostrar el error?

He probado a introducir el caracter ? que tiene el valor 10 y entraría dentro de mi rango. Ahí ya no manda el mensaje de error pero sí se mantiene el bucle infinito. En ambos casos sigue escribiendo "Introduce mes (numerico): " y se sigue saltando el scanf.

Gracias de antemano.


04-Jan-2022 18:59
Nacho Cabanes (+83)

El formato %d de "scanf" espera encontrar números en formato decimal. Saltará espacios en blanco (y tabulaciones, y saltos de línea), pero no se comportará correctamente si encuentra letras.

Si quieres filtrar los posibles problemas de que el usuario introduzca texto, deberás leer como cadena de texto y luego probar a convertir a número.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)