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...
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


0