Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: cundre en 10 Febrero 2011, 17:52 pm



Título: (solucionado)volver menu principal
Publicado por: cundre en 10 Febrero 2011, 17:52 pm
hola alguien me podria decir como volver al menu principal.
me esplico.
Tengo este ejemplo pero cuando quiero volver al inicio me
duplica el menu principal.
¿donde esta el fallo?

Código
  1. #include "stdio.h"
  2. char a, b, c;
  3. int res;
  4. main()
  5. {
  6. vez:
  7. do {
  8. printf("##### Menu Principal De Admin   #####\n");
  9. printf("Elige Opcion...\n");
  10. printf("A: Equipos En Esta Red...\n");
  11. printf("B: Nmap Localhost...\n");
  12. printf("C: Activar apache...\n");
  13. res = getchar();
  14. printf("\n");
  15.  
  16. } while (res!='a' && res != 'b' && res != 'c');
  17.  
  18.  
  19. if(res=='a') system ("nmap localhost");
  20. if(res=='b')
  21. {
  22. system ("nmap localhost");
  23. goto vez;
  24. }
  25. if(res=='c') system ("/etc/init.d/apache start");
  26. }
  27.  

Un saludo.


Título: Re: volver menu principal
Publicado por: Oblivi0n en 10 Febrero 2011, 18:22 pm
Fijate que el tipo de res es int, y en la condicion del while, lo estas comparando como si fuese un char,

Puedes hacer el menu como una funcion void, asi te quedara la funcion main mas libre.

Otros fallos:

Código
  1. #include "stdio.h"

Se debe incluir como #include <stdio.h>

"archivo" se utiliza para archivos que estan en la misma carpeta

la funcion main, es recomendable que vaya precedida de int, segun el standart

P.D: Evita usar la instruccion goto.

Saludos


Título: Re: volver menu principal
Publicado por: cundre en 10 Febrero 2011, 18:29 pm
ok entonces deberia crear una funcion void

y llamarla desde el main?


Título: Re: volver menu principal
Publicado por: Oblivi0n en 10 Febrero 2011, 18:38 pm
ok entonces deberia crear una funcion void

y llamarla desde el main?

Con el tamaño de codigo que tienes no seria necesario, pero cuando en un programa llamas al menu varias veces, comprenderas que es mas practico  :xD


Título: Re: volver menu principal
Publicado por: cundre en 10 Febrero 2011, 18:43 pm
Gracias por las aclaraciones
pero me sigue imprimiendo 2 veces el menu
deberia llamar a fmenu de alguna otra manera desde el main?


Código
  1. #include <stdio.h>
  2. char a, b, c;
  3. char res;
  4.  
  5. int main()
  6. {
  7. fmenu();
  8. }
  9.  
  10. void fmenu()
  11. {
  12. do {
  13. printf("##### Menu Principal De Admin   #####\n");
  14. printf("Elige Opcion...\n");
  15. printf("A: Equipos En Esta Red...\n");
  16. printf("B: Nmap Localhost...\n");
  17. printf("C: Activar red...\n");
  18. res = getchar();
  19. printf("\n");
  20.  
  21. } while (res!='a' && res != 'b' && res != 'c');
  22.  
  23. if(res=='a') system ("nmap localhost");
  24. if(res=='b')
  25. {
  26. system ("nmap localhost");
  27. main();
  28. }
  29. if(res=='c') system ("/etc/init.d/apache start");
  30. }
  31.  


Título: Re: volver menu principal
Publicado por: Ferno en 10 Febrero 2011, 20:41 pm
Se me hace que al darle a una letra y tocar enter, getchar() toma la letra, procesa, vuelve a imprimir el menú, pero no espera a que escribas otra letra, sino que lee el enter que presionaste anteriormente, y como es distinto de a, b o c, entonces vuelve a imprimir el menú. Deberías de limpiar el buffer de entrada (olvídate de usar fflush(stdin) como seguramente vayas a leer en tooooodos lados, por favor :D).

Otra cosa, es bastante feo llamar a la función main :P


Título: Re: volver menu principal
Publicado por: xassiz~ en 10 Febrero 2011, 21:44 pm
El fallo principal estaba en que los if tenían que estar dentro del while ;D

La variable res de tipo char, si, pero dónde utilizas las variables "a", "b" y "c"? :xD

Y por supuesto no usar goto.

Código
  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5. char res;
  6.  
  7. do {
  8. /* Pedimos datos */
  9. printf("##### Menu Principal De Admin   #####\n");
  10. printf("Elige Opcion...\n");
  11. printf("A: Equipos En Esta Red...\n");
  12. printf("B: Nmap Localhost...\n");
  13. printf("C: Activar apache...\n");
  14. res = getchar();
  15. printf("\n");
  16.  
  17. /* Los if */
  18. if(res=='a') system("nmap localhost");
  19. elseif(res=='b') system("nmap localhost");
  20. elseif(res=='c') system("/etc/init.d/apache start");
  21.  
  22. } while (res!='a' && res != 'b' && res != 'c');
  23.  
  24. return 0;
  25. }
  26.  


Título: Re: volver menu principal
Publicado por: cundre en 11 Febrero 2011, 17:18 pm
Bueno lo Solucione Gracias por las pistas.

añadi while(getchar()!='\n');
Para vaciar el buffer del teclado


Paso por paso:

- Llamada a scanf("%d", &numero);
- Como el buffer esta vacio, se espera a que el usuario introduzca por teclado:
- Introduces el numero 54 y pulsas Intro.
- El buffer ahora contiene esta cadena: "54\n"
- scanf() extrae el primer valor numerico que encuentra: 54
- El buffer contiene ahora: "\n"
- Llamada a scanf("%d", &numero); (por segunda vez)
- Como en el buffer ya hay un '\n' , que es como si ya hubieras pulsado Intro, se finaliza la entrada por teclado sin darte oportunidad a escribir nada.

referencia: http://foro.noticias3d.com/vbulletin/showthread.php?t=121100

no se si es la mejor manera pero comforme aprenda lo averiguare.

Un saludo.