Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: s3v3r en 24 Diciembre 2015, 14:28 pm



Título: Ayuda menu
Publicado por: s3v3r en 24 Diciembre 2015, 14:28 pm
Hola :D el caso es que quería hacer un menu con 5 opciones que si no se pincha ninguna de ellas me salte el menu otra vez... sencillo pero parece que no  :laugh:

Lo que tengo hasta ahora:


void menu() {
  char c;
  do {
    printf ("Menu\n");
    printf ("      A        (Pulsa A)\n");
    printf ("      O        (Pulsa O)\n");
    printf ("      C        (Pulsa C)\n");
    printf ("      V        (Pulsa V)\n");
    printf ("      S        (Pulsa S)\n");
    scanf("%c", &c);
    switch (c) {
  case 'A':      case 'a':
      A();
      break;
  case 'O':      case 'o':
      O();
      break;
  case 'C':      case 'c':
      C();
      break;
  case 'V':      case 'v':
      V();
      break;
  case 'S':      case 's':
      break;
    }
  } while (c!='S' || c!='s');

}

int main() {
  menu();
}


1)No se si esta bien hecho pero si pongo dos opciones en el while deja de funcionar... con nunguna de las dos se sale del menu.
2)No entra en ninguno de los casos desde que pongo el do while, solo se repite el menu constantemente aunque ponga unos valores correctos a c.
3)Cuando repite el menu siempre se repite 2 veces manteniendo el que ya estaba.

Si alguien puede ayudarme con esos 3 puntos


Título: Re: Ayuda menu
Publicado por: ivancea96 en 24 Diciembre 2015, 17:05 pm
Piensa bien la condición: c != 'S' || c != 's'
O es diferete de 'S', o es diferente de 's'. Siempre va a ser diferente de una de ellas.

Será: c!='S' && c!='s'


Título: Re: Ayuda menu
Publicado por: s3v3r en 24 Diciembre 2015, 17:37 pm
Cierto!!! Muy cierto, resulto estupido segun me lo explicaste jajajajaja
Fallo garrafal pero sigue saliendome dos veces cuando aprieto alguna condicion correcta... A o a
Puede ser que llame en el main y luego sea el do while en menu?


Título: Re: Ayuda menu
Publicado por: MAFUS en 24 Diciembre 2015, 18:46 pm
Muy buenas.

Pues eso es porque cuándo has introducido la opción a la siguiente ejecución del menú en el bufer del teclado sigue quedando el carácter de nueva línea. Éste es aceptado por scanf y la ejecución continua.

Inserta el código en tu switch y lo verás
Código
  1.  case '\n':
  2.      printf("*** NL ***\n");

Debes encontrar una forma de eliminar el este carácter del buffer después del scanf.

Eso sí, fflush(stdin); no es la forma  :rolleyes: