C/Visual C - Uso avanzado de scanf

 
Vista:

Uso avanzado de scanf

Publicado por Nenugr (3 intervenciones) el 31/03/2011 23:36:01
En primer lugar saludar a los que usan este foro ya que es mi primer mensaje...

Ante todo muchas gracias por vuestra ayuda por adelantado. Vayamos al meollo.

Necesito una pequeña ayuda para pulir un código bastante sencillo pero lo dificil es que funcione 100% perfecto como yo lo necesito. Me explico.

Si uso un banderín para impedir la entrada por teclado erronea de un caracter funciona perfectamente:

do
{
printf("Desea nueva consulta (S/N)?: ");
flag=scanf("%c",&Respuesta); //Banderin se carga con código de salida scanf
fflush(stdin);
if ((flag==0)||((flag!=0)&&(Respuesta!=115)&&(Respuesta!=83)&&(Respuesta!=110)&&
(Respuesta!=78))) //Si dato erroneo
{ //vuelve a linea
gotoxy(where(),where()-1); //anterior y la borra
clreol();
}
if ((Respuesta!=115)&&(Respuesta!=83)&&(Respuesta!=110)&&(Respuesta!=78))
//Si dato erroneo cambia estado banderin
{
flag='n';
}
}
while (flag=='n');

Este funciona perfectamente como he dicho....Hasta que metes la S o la N en mayusculas o minusculas vuelve a la linea anterior (ya que al darle al Return en la captura baja de linea) y la borra y se repite hasta dato correcto. Si introduces retorno sin datos funciona igual de bien.

Bien...Pues aqui viene el problema. Si esto mismo lo haces con números enteros o reales la cosa cambia:

do
{
printf("Introducir nº de horas trabajadas: ");
flag=scanf("%g",&Horastrabajadas); //Banderin se carga con código salida scanf
fflush(stdin);
if ((flag==0)||(Horastrabajadas<0)) //Si dato erroneo
{ //vuelve a linea
gotoxy(wherex(),wherey()-1); //anterior y la borra
clreol();
}
}
while ((flag==0)||(Horastrabajadas<0));

Funciona perfectamente si metes letras o números negativos....Es decir al igual que en el anterior sube a la linea superior y borra linea hasta que meter dato correcto. Pero si pulsas retorno sin datos hace el retorno de carro y sigue esperando datos.

Entiendo que en el ejemplo superior al estar esperando el scanf un dato tipo char con el %c y pulsando la tecla retorno el scanf lee el código ascii correspondiente y al no ser un caracter correcto pues vuelve a ejecutarse el ciclo do-while.

Sin embargo en el inferior al estar esperando el scanf un dato tipo real o float con el %g y darle a la tecla retorno no sale del propio scanf y sigue esperando datos pero ya una linea de la consola mas abajo. Y el truco de volver a la linea anterior y borrar no se ejecuta porque está todavía dentro de la función scanf. Y no digo nada si le das varias veces a retorno.

Claro luego metes un dato correcto y el cursor está en el sitio incorrecto y las siguientes salidas por pantalla están descuadradas (No he puesto el programa completo porque no es relevante al problema).

Bueno...Espero haberme explicado bien....

Nos os doy mas guerra...Pero si las gracias por adelantado de nuevo....

Saludos...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Uso avanzado de scanf

Publicado por Tom (619 intervenciones) el 01/04/2011 09:01:34
Me temo que tu problema no tiene fácil solución.
Si tu programita va a correr en ttys (entornos unix) puedes hacer alguna "trampa" modificando el comportamiento de la E/S con el comando stty para probar (por ejemplo, stty -echo hace que no se muestren los caracteres que tecleas).

Lo normal para resolver este tipo de problemas es usar funciones específicas de la consola DOS en win o de ttys en unix y cambiar el método de lectura de teclado para leer caracter a caracter (usando getchar() y similares).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso avanzado de scanf

Publicado por Nenugr (3 intervenciones) el 01/04/2011 09:16:19
Muchas gracias....Lo había pensado pero al ser introducción de enteros tendría que usar posteriormente una función de conversión y controlar si cada caracter introducido se corresponde a números o a letras para descriminar los datos erroneos...

En fin...Ya sabía yo que iba a ser tan facil...

Muchas gracias...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso avanzado de scanf

Publicado por Tom (619 intervenciones) el 07/04/2011 17:16:06
Bueno ... siempre puedes usar tus rutinas personalizadas de entrada por teclado, tu propio buffer (un string, por ejemplo) y finalmente usar sscanf(), en lugar de scanf() ..

O, si estás en unix o similar, usar ncurses :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar