C/Visual C - validacion de scanf

   
Vista:

validacion de scanf

Publicado por pedro (2 intervenciones) el 19/04/2017 15:48:01
hola buenos dias! tengo un problema con este programa, no puedo validar scanf, es un trabajo en el que hay que usar scanf si o si(nos lo hacen hacer para que nunca mas usemos scanf), se supone que si el usuario inserta algo que no corresponde, en este caso números enteros, scanf debería valer 0, y mandarme al menú de default, para nuevamente estar en el menú donde estabas parado, pero no se porque no me anda y cuando inserto una letra el programa este en un loop que solo puedo salir cerrando la ventana, y no pude encontrar el error. si me podrían ayudar seria genial, graciass





#include <stdio.h>
2 #include <stdlib.h>
3 #define SALIR 0
4 #define INICIO 1
5 #define MENU_PRINCIPAL 2
6 #define MENU_DE_ALTA_TENCION 3
7 #define MENU_DE_BAJA_TENCION 4
8 #define MENU_DE_ALTA_TENCION_RESISTENCIA_2 5
9 #define MENU_DE_ALTA_TENCION_RESISTENCIA_1 6
10 #define MENU_DE_ALTA_TENCION_VOLTAJE 7
11 #define VOLVER_A_MENU_ANTERIOR 8
12 #define DEFAULT 9
13
14 int main(void)
15 {
16 float resistor1, resistor2, voltaje, resistor3;
17 int menu;
18 int aux;
19 menu = INICIO;
20 while (menu!=SALIR)
21 {
22 switch(menu)
23 {
24 case INICIO:
25 puts("iniciando..");
26 menu = MENU_PRINCIPAL;
27 break;
28 case MENU_PRINCIPAL:
29 while(menu!=SALIR)
30 {
31 puts("\tMenu principal");
32 puts("ingrese:");
33 printf("%i para ir a menu de baja tencion\n",MENU_DE_BAJA_TENCION);
34 printf("%i para ir al menu de alta tencion\n",MENU_DE_ALTA_TENCION);
35 printf("%i para cerrar programa\n",SALIR);
36 aux = scanf("%i", & menu);
37 if(aux == 0)
38 {
39 menu = DEFAULT;
40 }
41 switch (menu)
42 {
43 case MENU_DE_ALTA_TENCION:
44 while (menu == MENU_DE_ALTA_TENCION)
45 {
46 puts("\tMenu de alta tención");
47 puts("(para valores entre 7 y 35 volts)\n");
48 puts("ingrese:");
49 printf("%i para obtener resistencia 2\n",MENU_DE_ALTA_TENCION_RESISTENCIA_2);
50 printf("%i para obtener resistencia 1\n",MENU_DE_ALTA_TENCION_RESISTENCIA_1);
51 printf("%i para obtener la tencion\n",MENU_DE_ALTA_TENCION_VOLTAJE);
52 printf("%i para volver al Menu principal\n",VOLVER_A_MENU_ANTERIOR);
53 printf("%i para cerrar programa\n",SALIR);
54 aux = scanf("%i", & menu);
55 if(aux==0)
56 {
57 menu = DEFAULT;
58 }
59 switch(menu)
60 {
61 case MENU_DE_ALTA_TENCION_RESISTENCIA_1:
62 puts("ingrese su valor de resistencia2 en ohms y la tencion");
63 scanf("%f %f", & resistor2, & voltaje);
64 resistor1 = voltaje * resistor2 - resistor2;
65 resistor3 = (resistor1 * resistor2) / (resistor1 + resistor2);
66 printf("su resistencia 1 es:%3fohms y su resisitencia 3:%3fohms\n\n", resistor1, resistor3);
67 menu = MENU_DE_ALTA_TENCION;
68 break;
69 case MENU_DE_ALTA_TENCION_RESISTENCIA_2:
70 puts("ingrese su valor de resistencia 1 en ohms y la tencion");
71 scanf("%f %f", & resistor1, & voltaje);
72 resistor2 = resistor1 / (voltaje - 1);
73 resistor3 = (resistor1 * resistor2) / (resistor1 + resistor2);
74 printf("su resistencia 1 es :%fohms y su resisitencia 3 es :%fohms\n\n", resistor1, resistor3);
75 menu = MENU_DE_ALTA_TENCION;
76 break;
77 case MENU_DE_ALTA_TENCION_VOLTAJE:
78 puts("ingrese sus resistencia 1 y su resistencia 2");
79 scanf("%f %f", & resistor1, & resistor2);
80 voltaje = (resistor1 + resistor2) / resistor2;
81 resistor3 = (resistor1 * resistor2) / (resistor1 + resistor2);
82 printf("su tencion es: %fvolts y su resistencia 3 es: %f\nohms\n\n", voltaje, resistor3);
83 menu = MENU_DE_ALTA_TENCION;
84 break;
85 case SALIR:
86 break;
87 case VOLVER_A_MENU_ANTERIOR:
88 menu = MENU_PRINCIPAL;
89 break;
90 default:
91 fprintf(stderr,"error, valor no valido, ingrese de nuevo\n");
92 menu = MENU_DE_ALTA_TENCION;
93 break;
94 }
95 }
96 break;
97 case MENU_DE_BAJA_TENCION:
98 puts("\n\tMenu de baja tencion");
99 puts("no hay opciones disponibles\n");
100 break;
101 case SALIR:
102 break;
103 default:
104 puts("error, valor no valido, intente de nuevo\n");
105 menu = MENU_PRINCIPAL;
106 break;
107 }
108 }
109 break;
110 }
111 }
112 return EXIT_SUCCESS;
113 }
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

validacion de scanf

Publicado por agustin (266 intervenciones) el 19/04/2017 17:10:23
Tu problema es que scanf espera un valor de tipo int o float (depende de la parte donde lo usas) y al introducir un carácter cómo una letra o un símbolo lo que hace scanf es intentar leerlo y al tener un formato incorrecto lo vuelve a dejar en el buffer de entrada y en la siguiente pasada vuelve a suceder lo mismo y se convierte en un bucle infinito.
Si te obligan a usar scanf tienes que leer como cadena y luego verificar la cadena y pasarla al formato deseado con sscanf, atoi, atof, strtol, o cualquier otro que te permita hacerlo.
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

validacion de scanf

Publicado por Pedro (2 intervenciones) el 19/04/2017 19:39:12
No sabía eso de que lo dejaba en el buffer.
Me ayudo, para terminar el trabajo, mil 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
Revisar política de publicidad