Otra de C

maRc

Estaba haciendo un programilla en C, lo he compilado y ejecutado, y en un momento en el que pide un número, si querer he puesto una letra, por lo que el programilla se ha rallado.

¿Hay alguna manera de hacer que si no lee lo que esperaba (o sea, lee una letra en lugar de un número), repita la petición sin rallarse?

Ahora lo tengo de manera que si el número no sen encuentra entre dos valores lo repita, pero me gustaría hacer también lo que he dicho antes. El código es el siguiente:

scanf("%d", &numero);
while(numero < 3 || numero > 6) {
printf("Numero erroneo, minimo 3, maximo 9.\n");
printf("Escribe otra vez el número: ");
scanf("%d", &numero);
}

javithelong

puede hacerse, pero con otra instruccion distinta a scanf, que no lea con formato

con una combinacion de un fgets y un atoi, puedes conseguir el mismo resultado, voy a poner algo parecido (fgets esta en stdio.h creo)

con:
#define MAX_AUX 10 // por ejemplo 10...(vale con 2 o 3)
char aux[MAX_AUX];
int numero;

printf ("Introduce numero: ");
while ((numero = (atoi (fgets (aux, MAX_AUX, stdin)))<3) || (numero>6))

printf ("Numero no valido\nIntroduce numero: ");

Si no entiendes algo, avisa

maRc

Muchas gracias, aunque el código que me has pasado no iba (al hacer un printf del número siempre salía 0), lo he modificado y me ha quedado así:

printf ("Introduce numero: ");
fgets(aux,MAX_AUX,stdin);
numero=atoi(aux);
while (numero <3 || numero >6) {
printf("Introduce otro");
    fgets(aux,MAX_AUX,stdin);
    numero=atoi(aux);
}
printf("Numero Introducido: %d\n", numero);

Repito, muchas gracias ;)

Josepanaero

A lo mejor el código de javithelong no te vale pq ha puesto "while ((numero = (atoi..." y debería haber puesto "while ((numero == (atoi...", no?? No lo sé seguro, pq yo de C no entiendo demasiado, yo he estudiado un poco C++. A ver si puedes probar de esta forma, a ver si te va tb ^^

Saludos!

Ju

Yo estoy como el #4, he estudiado algo de C++ y creo que lo que te ha dicho es probable, porque no puedes poner una asignacion como condición, si no una igualdad, y la igualdad (al menos en C++) es con doble =. Prueba con eso :)

Alperini

mm el c++ mola :D

Carcass

Una asignación es un operador como otro cualquiera y devuelve un valor, como todos...

Entonces, por ejemplo: if((numero = 5) > 3)

1) Asigna 5 a la variable número
2) Comprueba si el valor de numero (5) es mayor que 3, lo que es verdadero
3) Se cumple la condición :-P

Lo que hace #2 es parecido, pero asignando a "numero" el resultado de convertir a entero el valor leído...

Josepanaero

#5, #7 tiene razón xD

Sí q se puede poner ahí un operador = en vez de un operador ==, por eso no te va a dar ningún error en tiempo de compilación, pero quizás sí te dé un error lógico a la hora de ejecutar el programa, como por ejemplo el q estaba diciendo maRc de que la variable "numero" siempre valía 0.

Saludos!

Carcass

while ( (numero = atoi(fgets(aux, MAX_AUX, stdin))) < 3) || (numero > 6) )
printf ("Numero no valido\nIntroduce numero: ");

Estaban mal los paréntesis...

maRc

Con el código que he puesto ya me funcionaba :), pero gracias a todos ;)

Carcass

Pero el tuyo es muy feo y demasiado largo para mi gusto jeje

maRc

Hay muchas cosas feas en este mundo (por ejemplo el tipo de tu avatar xD).

javithelong

Hombre, solo puse 4 lineas de codigo del #1 en una unica linea. La verdad es que no he mirado donde puede estar mi fallo, pero sintactico creo que no es, probablemente logico, pero vamos, como ya te funciona, paso de comerme el tarro xD

De nada tio, un placer ayudar :D

Usuarios habituales

  • javithelong
  • maRc
  • Carcass
  • Josepanaero
  • Alperini
  • Ju