| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Pablex
Registrado: 09 Nov 2006 Mensajes: 5
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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:
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:
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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |