C - Ayuda Bucle infinito y no se el motivo

W

Hola mvideros, resulta que hemos comenzado C y nos han dado unos ejercicios muy simplones, en si el programa funciona bien, hace lo que tiene que hacer, peroooo.... hay un problemilla.

A ver se trata de que tenemos que meter un numero del 1 al 12 (estos incluidos) y el programa nos devuelve el nombre del mes.

#include <stdio.h>



void main(void) 

{



int num=0;

char *mes;



while ( num > 12 || num < 1 ) {

	printf ("Introduzca el numero del mes. \nNumero: ");

	fflush (stdin);

	scanf ("%d",&num);

}



switch (num) {

	case 1: mes = "Enero"; break;

	case 2: mes = "Febrero"; break;

	case 3: mes = "Marzo"; break;

	case 4: mes = "Abril"; break;

	case 5: mes = "Mayo"; break;

	case 6: mes = "Junio"; break;

	case 7: mes = "Julio"; break;

	case 8: mes = "Agosto"; break;

	case 9: mes = "Setiembre"; break;

	case 10: mes = "Octubre"; break;

	case 11: mes = "Noviembre"; break;

	case 12: mes = "Diciembre"; break;

}


printf ("El mes introducido es %s \n",mes);

}

El caso es que si meto un numero mayor a 12 o menor a 1 me vuelve a pedir el numero, ahi ningun problema, pero si le meto una letra, comienza a hacer un bucle infinito en el que no para de pedirme el numero y automaticamente hace un enter y me vuelve a pedir el numero.

Se supone que C trata las letras como numeros por el codigo ASCII por lo tanto suponiendo que las letras son numeros, si A es 43 (x poner un ej) deberia volver a pedirme el numero (cosa que hace) pero esperarse a que lo pudiera meter para decirme si pasa o si me lo vuelve a pedir.

Le he preguntado a 2 profesores pero no tienen idea de cual puede ser el motivo, si me pudierais explicar os lo agradeceria.

Saludos.

RaymaN

Hace tiempo que no toco C, pero el fflush va después del scanf. Puede que al meter una letra empiece a meterte mierda en el buffer y pete todo.

maRc

A primera vista el código no tiene ningún fallo, lo acabo de compilar y tampoco me falla...

zildjian

Directamente creo que no hace falta el fflush... para qué? Si se supone que el programa después de introducir un nº no va a volver a preguntarte otro no? Entonces no tienes que limpiar el buffer... Prueba quitándolo y comenta!

Kartalon

Para empezar, los retornos de carro son "\n" no "n".

fflush lo que hace es descartar todos los datos que haya en un búfer, en este caso la entrada estándar, no necesitas flushear la entrada estándar porque no has introducido ningún dato aun :\

Para todo lo demás lo que dicen abajo (que me había colado y no me había dao cuenta que era una letra xD)

AkroS

El problema es que el scanf espera un entero, y si metes una letra se peta. Cuando pasa esto el scanf devuelve un 0 o EOF como error.
Una solución es crear una variable y asignarle el scanf, luego con una condición de si devuelve 0 o EOF, tengas que meter un intro por ejemplo.

Si no lo he explicado bien o no quieres intentar te dejo como creo que sería:

spoiler

Lo he probado, y metiendo eso donde el scanf ya no se peta al meter una letra :)

MrPaytoN

Pues yo he usado mi compilador habitual ( Borland C++) y ningún problema xD

W

Perdonar donde ponia lo de n que no ponia la \ se ha debido quitar :S

El fflush ya se que si no meto nada antes no tengo xq ponerlo pero asi me acostumbro a ponerlo y me aseguro que de que antes de que entre el proximo dato este vacio.

PD: Gracias a todos.

Z3R0KULL

Y si en vez de un while metes un if (que abarque todo, switch incluido) y asi no entra en el switch cuando metes un numero que no esté en el rango 1-12?

Master_0n3

Quizás si al switch le metes un default?

También puede ser porque el scanf está esperando un entero, y si le metes una letra es un carácter...

Cravendish

pues yo acabo de compilarlo con devc++ y todo correcto, si meto una letra, pide otro numero :)

Usuarios habituales

  • Cravendish
  • willy__chaos
  • MrPaytoN
  • AkroS
  • Kartalon
  • maRc
  • RaymaN