es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El menú se imprime dos veces y el valor por defecto se ejecuta incluso cuando no coincide el caso.

Estoy intentando mostrar al usuario un menú y permitirles elegir entre las opciones. Está en un bucle while porque tiene que iterar hasta que se elija la opción “e” para salir del programa. Incluí la opción “default” como medida de seguridad en caso de que el usuario ingrese un valor que no sea aceptado. El caso predeterminado siempre se ejecuta sin importar lo que haga y el menú siempre aparece dos veces después de la ejecución inicial del código.

He intentado cambiar “getchar()” por scanf y todavía produce la misma salida duplicada. También he intentado eliminar completamente el interruptor, pero obtengo el mismo resultado utilizando declaraciones if/then. Adjunto mi código completo y cualquier ayuda es apreciada, ¡gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Resolución de problemas en un bucle de menú en C

    Problema

    El usuario está creando un menú que permite seleccionar opciones hasta que se elija salir del programa. Sin embargo, el menú aparece dos veces después de la ejecución inicial del código. Además, el caso predeterminado siempre se ejecuta independientemente de la entrada que se ingrese.

    Solución

    El código actual incluye la función menu () que muestra las opciones del menú al usuario. La función options () toma una opción del menú seleccionada como entrada y la procesa con una instrucción switch para determinar qué acción se debe tomar. Finalmente, la función principal contiene un bucle while que llama a la función menu () y luego espera la entrada del usuario con getchar (). Si el usuario ingresa una selección válida, se llama a la función options () con la selección del usuario. Este bucle continúa hasta que el usuario selecciona la opción “salir”.

    El problema con el código actual es que la función getchar () está consumiendo el carácter de nueva línea que el usuario ingresa después de hacer una selección. Sin embargo, este carácter de nueva línea no se está considerando en la función options (), lo que hace que se ejecute el caso predeterminado. Además, el carácter de nueva línea se devuelve a la función menu (), lo que hace que se muestre el menú dos veces.

    Para solucionar este problema, podemos modificar la función options () para que también consuma el carácter de nueva línea utilizando otra llamada getchar (). Además, podemos modificar la función menu () para incluir un carácter de nueva línea al final de su salida para asegurarnos de que solo se muestre un menú.

    Aquí hay una versión actualizada del código con estos cambios:

    #include <stdio.h>
    #include <stdlib.h>
    
    // función para el menú
    void menu() {
        printf("Por favor seleccione una opción del siguiente menú:\n");
        // configuración del menú
        printf("a. Ingresar ubicación de los archivos de datos\n");
        printf("b. Ingresar el intervalo de tiempo\n");
        printf("c. Procesar y mostrar los datos de expectativa de vida en los Estados Unidos\n");
        printf("d. Procesar y mostrar las estadísticas de todos los datos\n");
        printf("e. Salir del programa\n");
        printf("\n"); // agregar carácter de nueva línea
    }
    
    void options() {
        char choice;
        while ((choice = getchar()) == '\n') {}; // consumir carácter de nueva línea
        switch (choice) {
            case 'a':
                printf("opción a\n");
                break;
            case 'b':
                printf("opción b\n");
                break;
            case 'c':
                printf("opción c\n");
                break;
            case 'd':
                printf("opción d\n");
                break;
            case 'e':
                break;
            default: // predeterminado cuando no se empareja ninguno de los casos
                printf("Entrada inválida\n");
                break;
        }
    }
    
    // función principal
    int main(void) {
        char choice;
        do {
            menu();
            options();
        } while (choice != 'e');
    }
    

    Con estos cambios, el menú se mostrará solo una vez y el caso predeterminado solo se ejecutará cuando el usuario ingrese una entrada no válida.</stdlib.h></stdio.h>

Comments are closed.