Ver Mensaje Individual
  #8 (permalink)  
Antiguo 27/04/2012, 12:48
cesar_casla
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 13 años
Puntos: 94
Respuesta: problema con enteros u caracteres

Paso x paso xD:
1º el scanf retorna la cantidad de numeros ingresados correctamente. Si haces a=scanf("%d",&var); e ingresas un valor entero(osea un valor correcto, ej: 45), scanf retorna 1, a=1
Ahora si haces a=scanf("%d %d",&var1,&var2); e ingresas dos valores enteros(7 y 25), scanf retorna 2, a=2. ¿Pero que pasa si ingresas un valor correcto(ej: 9) y otro mal(un caracter 'm')?? scanf va a retornar 1, a=1 ¿xq? porque solo se ingreso un valor bien el otro no era un entero
Volviendo al programa: a=scanf("%d",&opcion); si vos ingresas un entero a=1; si vos ingresas algo q no sea un entero a=0. Es por esto que hay q poner como condicion a!=1. Si "a" es distinto de 1 es porque se ingreso mal el dato y el bucle do-while se va a seguir ejecutando hasta que se ingrese un entero
La otra condicion !( 0 < opcion && opcion < 5) es para que opcion este entre 1 y 5 PERO no tiene nada q ver la variable "a" con "opcion". Esta condicion tambien hace que el bucle continue cuando no se ingresa un numero entre 1 y 5

2º El funcionamiento de while( getchar() != '\n');
Tenemos scanf("%d",&opcion); supongamos que se ejecuta esto, por consola ingresamos un numero e inmediatamente despues se ingresa un ENTER, el numero se almacena en opcion y el ENTER queda en el bufer. Ahora en vez de ingresar un numero ingresamos tres letras "abc", en opcion no se almacena nada ya que hubo un error en el ingreso(scanf retorna 0) pero a b y c se almacenan en el bufer. Esto provoca que posteriores lecturas del scanf tambien tengan error
Sabiendo q la funcion getchar lo que hace es tomar un caracter del bufer, y siguiendo con el ejemplo de ingreso "abc"...Si solo se hubiera echo getchar(); se tomaria el el caracter 'a' pero b y c quedarian aun en el bufer. Es por esto que se hace el bucle while para que getchar tome todos los caracteres del bufer inclusive el ENTER

Espero se haya entendido algo :S

Saludos

Última edición por cesar_casla; 27/04/2012 a las 13:02