Ayuda con Código "Simple en C" Hacer que solo se ingresen numeros

Iniciado por ZedGe, 30 Diciembre 2011, 20:06 PM

0 Miembros y 1 Visitante están viendo este tema.

Leyer


ZedGe

Cita de: Leyer en 30 Diciembre 2011, 20:56 PM


No leiste lo que dije


Lo de usar un char y pasarlo a int?? lo probe pero tampoco salio bien

KuraraGNU

Leyer tiene razón, no puedes hacer

scanf("%d",&opcion)

Porque en el caso de meter una letra saltaría un error del programa y no lo estás controlando, por eso tienes que pasarlo a numero una vez recogido, pero no en la misma recolección, cambia tu código por lo que puso él, o cambia el tipo de dato que recoje "opcion" (Yo creo que es lo mejor, pero no se por qué tipo deberías cambiarlo, no se qué es lo que devuelve una tecla si un número, un char o un que, cuando yo he programado devuelve un código numérico que luego hay que parsear a lo que quieras usar). Yo lo siento no se mucho de c.

Cita de: Leyer en 30 Diciembre 2011, 20:34 PM

char option[2];
printf("Opcion: ");
scanf("%s",option);
int opt=atoi(option);
if(opt>3&&opt>10||opt==0)printf("fuera");



Cita de: Leyer en 30 Diciembre 2011, 20:34 PMPD: 2 paginas en esta boludes

Lo siento, es que como sólo pegó parte del código yo dije lo que veía mal en esa parte del código u.u espero no haber parecido muy tonta.

ZedGe

La Salucion es:


char opcion[2];//Variable que Guarda la opcion del menu


Las opciones siguen siendo 1,2,3,10, pero al ingresar una letra o uno distinto hace lo que quiera que es volver al menu... Gracias a todos =D

KuraraGNU

Es una de las posibles soluciones sí, es la que más me gustaba a mi, pero lo que dijo Leyer también debería de funcionar. ¿Ves? El problema estaba en la recogida de datos ^-^

rir3760

Si nos enfocamos solo en el menú las operaciones a realizar son:

1) Leer un entero de la entrada estándar, para ello basta con scanf.

2) Descartar el resto de la linea, necesario ya que si scanf no puede realizar una conversión los caracteres se mantienen en el bufer de la entrada estándar.

3) Discriminar el numero mediante una sentencia de selección.

Un programa de ejemplo, lo mas sencillo posible es:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int opcion;
   int ch;
   int ok;
   
   do {
      puts(" 1) Opcion A");
      puts(" 2) Opcion B");
      puts(" 3) Opcion C");
      puts("10) Salir");
     
      /* 1) Tratamos de leer un numero */
      ok = 1;
      if (scanf("%d", &opcion) != 1){
         puts("Entrada no valida!");
         ok = 0;
      }
     
      /* 2) Descartamos el resto de la linea */
      while ((ch = getchar()) != EOF && ch != '\n')
         ;
     
      /* 3) Si es un numero se selecciona la operacion */
      if (ok)
         switch (opcion){
         case 1:
            puts("La opcion seleccionada es la A");
            break;
         case 2:
            puts("La opcion seleccionada es la B");
            break;
         case 3:
            puts("La opcion seleccionada es la C");
            break;
         case 10:
            puts("La opcion seleccionada es terminar");
            break;
         default:
            puts("Numero fuera del rango valido!");
            break;
         }
   }while (opcion != 10);
   
   return EXIT_SUCCESS;
}


Por cierto utilizar scanf y similares tiene sus limitaciones, Si se necesita una validación a prueba de fallos se debe recurrir a las funciones strtol, strtoul o strtod.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language