Test Foro de elhacker.net SMF 2.1

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?


#include "stdio.h"
char a, b, c;
int res;
main()
{
vez:
do {
printf("##### Menu Principal De Admin   #####\n");
printf("Elige Opcion...\n");
printf("A: Equipos En Esta Red...\n");
printf("B: Nmap Localhost...\n");
printf("C: Activar apache...\n");
res = getchar();
printf("\n");

} while (res!='a' && res != 'b' && res != 'c');


if(res=='a') system ("nmap localhost");
if(res=='b')
{
system ("nmap localhost");
goto vez;
}
if(res=='c') system ("/etc/init.d/apache start");
}


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:

#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
Cita de: cundre en 10 Febrero 2011, 18:29 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?



#include <stdio.h>
char a, b, c;
char res;

int main()
{
fmenu();
}

void fmenu()
{
do {
printf("##### Menu Principal De Admin    #####\n");
printf("Elige Opcion...\n");
printf("A: Equipos En Esta Red...\n");
printf("B: Nmap Localhost...\n");
printf("C: Activar red...\n");
res = getchar();
printf("\n");

} while (res!='a' && res != 'b' && res != 'c');

if(res=='a') system ("nmap localhost");
if(res=='b')
{
system ("nmap localhost");
main();
}
if(res=='c') system ("/etc/init.d/apache start");
}
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.


#include<stdio.h>

int main()
{
char res;

do {
/* Pedimos datos */
printf("##### Menu Principal De Admin   #####\n");
printf("Elige Opcion...\n");
printf("A: Equipos En Esta Red...\n");
printf("B: Nmap Localhost...\n");
printf("C: Activar apache...\n");
res = getchar();
printf("\n");

/* Los if */
if(res=='a') system("nmap localhost");
elseif(res=='b') system("nmap localhost");
elseif(res=='c') system("/etc/init.d/apache start");

} while (res!='a' && res != 'b' && res != 'c');

return 0;
}
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.