Ayuda con C (muy basico)

Veamos, estoy haciendo un "ejercicio" de clase en C (xq programa no lo llamaria yo) e intento hacer que cuando en un scanf introduzcas algo que no sea un número real de un menaje de error y me vuelva a aparecer la opcioón para introducir correctamente el número.
Este es el codigo que he utilizado:

while (d==0)
{
printf("Introduce primer número:");
if (scanf("%f", &a )==0)
printf("Error el número introducido no es correcto\n\n");
else
d++;
}

El problema es que cuando al ejecutar el programa e introducir una letra, el mensaje de error aparece, pero infinitas veces..... es decir me aparece todo el rato:

#Introduce primer número: Error el número introducido no es correcto

Y no se por qué [tomaaa] [tomaaa]
cuándo el programa hace el if y el scanf da error no deberia imprimir el mensaje en pantalla y volver a emezar simplemente?

Alguna idea de solución?? (decir que solo he dao tres clases de C en la uni y poco más... XD)

[bye] Gracias!

Edito, que me he equivocado de Foro, a ver si alguien me lo puede mover a Varios,
Asi a primeras se me ocurre que sea que como usas un mismo valor, suongo que tendrias que meter algo que cambiase el valor de la variable y por eso te cree un valor infinito.

Tambien se me ocurre que lo mismo guarda demasiado en memoria, como si usases una cadena. Limpia la memoria del teclado despues de introducir el numero (fflush(out) creo que era)

Habre dicho muchas burradas pero bueno...

Saludos!
Estoy con \-\adEs pero el comando exacto es fflush(stdio), que limpia el buffer de entrada, por defecto el teclado, creo que la expilcación era algo asi [ginyo]
fflush(stdin); es lo que yo siempre he usado...

Esto pasa por que se quedan carácteres en el buffer (por que no se ha limpiado ) y entonces scanf pilla esos caracteres... es lo típico para cuando te kieren joder y meten una letra en vez de un número :-p

Salu2
druid keltac escribió:Estoy con \-\adEs pero el comando exacto es fflush(stdio), que limpia el buffer de entrada, por defecto el teclado, creo que la expilcación era algo asi [ginyo]


fflush(stdin) y fflush(stdout) que stdio es la libreria XD

Saludos!
Veamos he probado a añadir la ínea
fflush(stdin);
o la línea
fflush(stdout);
en varios sitios y.. como si no estuviese.

El problema creo que si que es ese qu no me vacia el buffer del teclado, pero.. no se como arreglarlo....

[bye] Gracias de todos modos
Uuuups.... que fallo, que olvidado que tengo el C [Ooooo]
A ver, el if es algo redundante, me explico:

if (scanf("%f", &a )==0)

el ==0 deberia de sobrar y quedaria como:

if (!scanf("%f", &a ))

y luego la linea ELSE sobra de ahi(a no ser que el programa sea mas grande y haga mas cosas, pero con esta info es lo que creo que es.

entonces sin el "else", si metes un numero sale del programa sin problemas, si no lo metes da el error una sola vez.

Un saludo.

EDITO:

#include

main()
{
int d=0;
float a;

while (d==0)
{
printf("Introduce primer número:");
if (!scanf("%f", &a )) {
printf("Error el número introducido no es correcto\n\n");
fflush(stdin);
}
else d++;

}
}

de esta forma siempre te pide el numero mientras no metas un numero real y no un caracter
Prueba con esto:


while (d==0)
{
d=0; /* <---- Inicializa la variable dentro del bucle */
printf("Introduce primer número:");
if (scanf("%f", &a )==0)
printf("Error el número introducido no es correcto\n\n");
else
d++; /* También valdría d=1 por ejemplo */
}


O si te gusta más (a mi sí)...

do
{
d=0; /* <---- Inicializa la variable dentro del bucle */
printf("Introduce primer número:");
if (scanf("%f", &a )==0)
printf("Error el número introducido no es correcto\n\n");
else
d++;
} while (d==0);
El programa en cuestion es este.

#include

main()
{
int a, b, c;
a = b = c = 0, d = 0;

printf("Este programa compara tres números enteros y dice que número es el mayor.\n");

while (d==0)
{
printf("Introduce primer número entero:");
if (scanf("%d" , &a )==0) {
printf("Error el número introducido no es correcto\n");
fflush(stdin);
}
else
d++;
}

while (d==1)
{
printf("Introduce segundo número entero:");
if (scanf("%d", &b )==0) {
printf("Error el número introducido no es correcto\n");
fflush(stdin);
}
else
d++;
}

while (d==2)
{
printf("Introduce tercer número entero:");
if (scanf("%d", &c)==0) {
printf("Error el número introducido no es correcto\n");
fflush(stdin);
}
else
d++;
}

if (a>b && a>c)
printf("El número %d es el mayor de los tres\n", a);

if (b>a && b>c)
printf("El número %d es el mayor de los tres\n", b);

if (c>a && c>b)
printf("El número %d es el mayor de los tres\n", c);

if (a==b && a>c)
printf("El primer y el segundo número son iguales y además son los mayores.\nEl numero mayor es el %d.\n", a);

if (a==c && c>b)
printf("El primer y el tercer número son iguales y además son los mayores.\nEl numero mayor es el %d.\n", c);

if (c==b && c>a)
printf("El segundo y el tercer número son iguales y además son los mayores.\nEl numero mayor es el %d.\n", c);

if(a==b && b==c)
printf("Los tres números son iguales.\n");

return 0;
}


La cuestion es que el fflush(stdin); no hace na...

He encontrado otra manera de que me salga el mensaje de error y no sea infinito, pero... es finalizando el programa [sonrisa] .

Por otra parte se que es muy largo para lo poca cosa que es... pero sq solo llevo 4 clases y nos hemos quedado en el if...

[bye] gracias a todos!

Fox, Adso58, mañana cuando mi padre me deje reiniciar en Linux probaré con vuestras soluciones a ver quien es el que acierta je,je.

Por cierto, el lenguaje que uso es C , no C + + lo digo xq toda la información del fflush que he encontrado por google se refiere a C+ +...

Bueno, muchas gracias por vuestra ayuda!
mañana miro tu codigo y lo arreglo, que voy a la cama ;)
Podeis seguir dándole vueltas al fflush que nada XD, el problema es que el scanf en tiempo de ejecución casca si le metes un tipo distinto al declarado. Se me ocurren algunas formas, desde declarar una variable cadena, hacer el scanf sobre ella y luego hacer la conversión de tipo, o currarse una función con getch, que mire si el caracter es un número, y si lo es almacenarlo en una variable.
fgetc tiene mejor pinta que scanf y que getch

Salu2.Ferdy
el amigo no esta trabajando con ficheros ferdy.

Un saludo.
Batousay escribió:
Fox, Adso58, mañana cuando mi padre me deje reiniciar en Linux probaré con vuestras soluciones a ver quien es el que acierta je,je.



Oye, olvida mi post, que no se en que estaría pensando, pero no te lo va a solucionar (no es bueno eso de escribir muerto de sueño [carcajad] ).

La verdad es que el scanf es muy puñetero en cuanto no le metes lo que espera. A ver si puedo luego y pruebo a ver alguna cosilla a ver si se arregla.
Fox escribió:el amigo no esta trabajando con ficheros ferdy.

Un saludo.


La entrada estándar también es un fichero ;)

Usar funciones como scanf o gets es muy peligroso, no se hacen comprobaciones de los datos y es muy fácil provocar un buffer overflow, por eso se usan las funciones f*, que permiten decir de cuanto tamaño es el buffer.
ainss, yo es que soy de la 'nueva escuela' y empecé directamente con c++, por lo que no puedo ayudarte demasiado.

lo que es la estructura del programa me parece correcta, pero parece haber algo por ahí, presumiblemente a la hora de introducir el valor, como han comentado, que fastidia la cosa.

siento no poder ser de más ayuda, pero aquí tienes mi apoyo para lo que esté en mi mano :) (aunque sea sólo moral :P)


saludos
Churly escribió:
La entrada estándar también es un fichero ;)

Usar funciones como scanf o gets es muy peligroso, no se hacen comprobaciones de los datos y es muy fácil provocar un buffer overflow, por eso se usan las funciones f*, que permiten decir de cuanto tamaño es el buffer.


Supongo que tendras razón, yo esque en el tema de buffers estoy MUY MUY perdido :S

Un saludete.
17 respuestas