/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problema con el scanf

 
      Índice del Foro elrincondelc.com -> Dev-C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Pablex



Registrado: 09 Nov 2006
Mensajes: 5

MensajePublicado: 15/04/2007 1:04 pm
Título: Problema con el scanf

Hola a todos los del foro, tengo esta inquietud...
Al compilar esto, deseo que despues de realizar la tarea de mostrarme le valor en hexadecimal seguido pida tocar la opcion para compararla y salirme del bucle o quedarme dentro, pero lo que hace en mi compilador es brincarce el scanf y empieza el bucle nuevamente... espero esplicarme bien... utilizo DEV C++ Win XP



while (opcion !='z')
{
system ("cls");
printf("Presione z para volver al menu principal\n");
printf("------------------------------------------------------------\n");
printf("Introdusca un valor decimal:\n\n");
scanf("%d", &valor);
printf("%d en hexadecimal corresponde a %x\n", valor, valor);
system ("pause");
scanf("%c",&opcion);
}
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3841
Ubicación: Mexico

MensajePublicado: 15/04/2007 5:13 pm
Título:

Eso se debe a la forma en que opera scanf: cuando le pides que lea un entero este es almacenado en la variable en cuestion pero el avance de linea se queda en el bufer de la entrada estandar. Despues de esto cuando scanf trata de leer un unico caracter es ese caracter (el avance de linea) el que procesa.

En otras palabras debes de eliminar cualquier caracter restante en la linea despues de leer el entero almacenado en la variable "valor":
Código:
while (opcion !='z'){
   int ch;
   
   system ("cls");
   
   printf("Presione z para volver al menu principal\n");
   printf("------------------------------------------------------------\n");
   
   printf("Introdusca un valor decimal:\n\n");
   scanf("%d", &valor);
   while ((ch = getchar()) != EOF && ch != '\n')
      ; /* Descartamos el resto de la linea */
   
   printf("%d en hexadecimal corresponde a %x\n", valor, valor);
   system ("pause");
   scanf("%c",&opcion);
}


Asi deberia funcionar correctamente.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Pablex



Registrado: 09 Nov 2006
Mensajes: 5

MensajePublicado: 01/05/2007 5:41 pm
Título:

Te lo agradesco rir3760, en ejemplo es justamente lo que necesitaba...

Pero una cosa más, solo por saber, me podrias explicar + o - como es que trabaja esta zozodicha linea magica que soluciona mis problemas...

Te lo agradesco de antemano, y si no pudieras tambien te lo agradesco.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3841
Ubicación: Mexico

MensajePublicado: 02/05/2007 5:50 am
Título:

Supongo que te refieres a este fragmento de codigo:
Código:
scanf("%d", &valor);
while ((ch = getchar()) != EOF && ch != '\n')
      ; /* Descartamos el resto de la linea */


1) Con scanf leemos un valor entero ignorando el espacio blanco, por ejemplo si el usuario introduce:
Código:
        123       {ENTER}


La mentada funcion ignora el espacio blanco al principio, se "traga y convierte" los caracteres '1', '2' y '3' en un numero que almacena en "valor" y el espacio blanco a continuacion del '3' se queda esperando a ser procesado por nuestro programa.

2) El bucle a continuacion lo que hace es:

2.1) Tratar de leer un caracter con:
Código:
(ch = getchar())


2.2) getchar devuelve EOF si no hay mas caracteres que leer. Esto es lo primero que verificamos, en otras palabras para asegurarnos que getchar lea con exito un caracter de la entrada estandar utilizamos:
Código:
(ch = getchar()) != EOF


2.3) Este proceso lo debemos repetir hasta que el caracter en curso sea el caracter de linea nueva o '\n', esto nos indicaria que se habria procesado toda la linea y lo verificamos mediante la segunda parte de la condicion:
Código:
while ((ch = getchar()) != EOF && ch != '\n')
   ; /* Descartamos el resto de la linea */


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> Dev-C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com