Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con este codigo...

Estas en el tema de Problema con este codigo... en el foro de C/C++ en Foros del Web. Saludos... Me ayudan con el siguiente codigo??? el problema es que no se ejecuta la linea marcada en rojo... Me queda en un cilo infinito... ...
  #1 (permalink)  
Antiguo 18/07/2008, 22:58
 
Fecha de Ingreso: diciembre-2005
Mensajes: 8
Antigüedad: 18 años, 4 meses
Puntos: 0
Pregunta Problema con este codigo...

Saludos... Me ayudan con el siguiente codigo??? el problema es que no se ejecuta la linea marcada en rojo... Me queda en un cilo infinito... se supone que cuando se adivine el número debo capturar la respuesta a la pregunta ¿Quieres jugar otra vez? y por el contrario vuelve a pedir la primera respuesta... osea ignora "(scanf("%c", &YesONo);"

// Adivinar un número entre 1 y 1000.

#include <stdio.h>

int main(void)
{
int numero;
int respuesta;
char YesONo = 's';

while(YesONo != 'n')
{
respuesta = 0;
srand(time(NULL));
numero = 1 + (rand() % 1000);

printf("Tengo un número entre 1 y 1000\n");
printf("¿Puedes adivinar cual es?\n");
printf("Por favor escribe tu primera respuesta\n");

scanf("%d", &respuesta);


do
if(numero == respuesta)
;
else
{
if(numero > respuesta)
printf("Muy abajo. Intenta de nuevo\n");
else
printf("Muy arriba. Intenta de nuevo\n");

scanf("%d", &respuesta);
}
while(numero != respuesta);

printf("¡Excelente! ¡Adivinaste el número!\n");
printf("¿Quieres jugar otra vez (s o n)?\n");
scanf("%c", &YesONo);
}

return 0;

}
  #2 (permalink)  
Antiguo 19/07/2008, 02:37
Avatar de Xinef  
Fecha de Ingreso: marzo-2007
Mensajes: 202
Antigüedad: 17 años, 1 mes
Puntos: 7
Respuesta: Problema con este codigo...

Cita:
Iniciado por ghvg Ver Mensaje
[...]a la pregunta ¿Quieres jugar otra vez? y por el contrario vuelve a pedir la primera respuesta... osea ignora "(scanf("%c", &YesONo);"
El "problema" es el scanf y el buffer de entrada.

Cuando introduces un carácter, en el buffer de entrada se queda el "intro" que has hecho... y el siguiente scanf lo acepta.

La solución? No usar scanf o hacer una prelectura del buffer para vaciarlo. Con la prelectura sólo tienes que hacer un:

Código PHP:
getc(STDIN); 
justo antes del scanf.

(nota: esa órden no es muy "académica", puesto que getc espera un flujo de fichero... pero vamos, funciona :))
  #3 (permalink)  
Antiguo 19/07/2008, 02:54
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Problema con este codigo...

También puedes probar con scanf("\n%c", &YesONo);
  #4 (permalink)  
Antiguo 19/07/2008, 08:25
 
Fecha de Ingreso: diciembre-2005
Mensajes: 8
Antigüedad: 18 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Problema con este codigo...

Gracias Ahora si me funciona!... Probe con las dos soluciones y en ambos casos me funciono.... Un problema que me pasaba a menudo... Pero ahora lo entiendo. De nuevo muchas gracias...
  #5 (permalink)  
Antiguo 19/07/2008, 09:42
 
Fecha de Ingreso: julio-2008
Mensajes: 38
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Problema con este codigo...

Cita:
Iniciado por Xinef Ver Mensaje
(nota: esa órden no es muy "académica", puesto que getc espera un flujo de fichero... pero vamos, funciona :))
¿Y qué te crees que es stdin? ¿Un flujo de moscas?

PD: Por cierto, es stdin, no STDIN.
  #6 (permalink)  
Antiguo 20/07/2008, 19:12
 
Fecha de Ingreso: julio-2008
Mensajes: 19
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Problema con este codigo...

¿Qué se supone que haga scanf("\n%c", &YesONo); y stdin ?

No lo habia visto y nunca lo eh utilizado
  #7 (permalink)  
Antiguo 21/07/2008, 02:05
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Problema con este codigo...

Cita:
Iniciado por d4rkzone Ver Mensaje
¿Qué se supone que haga scanf("\n%c", &YesONo); y stdin ?

No lo habia visto y nunca lo eh utilizado
Hace lo que dijo Xinef:
Cita:
Cuando introduces un carácter, en el buffer de entrada se queda el "intro" que has hecho... y el siguiente scanf lo acepta.
La solución? No usar scanf o hacer una prelectura del buffer para vaciarlo.
Te lo explico con más detalle:
cuando el usuario introduce un número tiene que presionar intro, eso ocurre al momento de usar "scanf("%d", &respuesta);" la tecla intro se "queda" en el buffer de entrada, al leer el siguiente carácter con "scanf("%c", &YesONo);" se lee el intro que ya está en el buffer, por lo que la variable YesONo pasa a tener el valor 10 ( YesONo=='\n' ) y el programa falla, la solución es leer el intro del buffer o saltarlo, con "getc(stdin);" lo lees y con "scanf("\n%c", &YesONo);" te lo saltas, pero en ambos casos el resultado es el mismo y el problema se soluciona.

stdin es un apuntador al buffer de entrada de la consola, en principio cualquier función para la lectura de archivos se puede usar con stdin, como getc, fgets, etc. también hay stdout que es un apuntador de salida a la consola y stderr que por lo general también es un apuntador a la consola. Sin embargo, todo esto que he dicho, depende del sistema en el que se esté trabajando ya que estos apuntadores se pueden redirigir a algún otro punto, como a un archivo por ejemplo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:39.