cómo crear un menú interactivo en C que se mueve de una función a otra sin volver a dibujar el menú

Mi objective es producir un progtwig que tome un archivo como entrada y “codifique” el texto al desplazar los caracteres 3 hacia adelante (por lo que ‘a’ vendría ‘d’). Debe producir un archivo de salida con el texto codificado. El menú es tomar la entrada del usuario y ejecutar la función asignada al número seleccionado.

Al principio estoy creando este progtwig, pero me estoy quedando sin tiempo y estoy luchando con la forma de estructurarlo. Actualmente, tengo el menú en pantalla, pero cuando se llama a una función secundaria, se muestra pero luego el menú lo sobrescribe y no puedo entender por qué. Cualquier ayuda sería apreciada. Aquí está el código que tengo hasta ahora …

#include  #define INPUT_FILE 1 //define statements #define OUTPUT_FILE 2 #define NUM_TO_SHIFT 3 #define ENCODE 4 #define QUIT 0 int menu(); //function prototypes int input(); int output(); int shift(); int encode(); void quit(); int main() { int choice; // main variables char user_filename[100]; choice = menu(); // get user's first selection while(choice != QUIT) //execute so long as choice is not equal to QUIT { switch(choice) { case INPUT_FILE: printf("Enter the filename of the file to encode:\n"); printf("(hit the Enter key when done)\n"); gets(user_filename); break; case OUTPUT_FILE: output(); break; case NUM_TO_SHIFT: shift(); break; case ENCODE: encode(); break; case QUIT: quit(); break; default: printf("Oops! An invalid choice slipped through. "); printf("Please try again.\n"); } choice = menu(); /* get user's subsequent selections */ } printf("Bye bye!\n"); return 0; } int menu(void) { int option; printf("Text Encoder Service\n\n"); printf("1.\tEnter name of input file (currently 'Secret.txt')\n"); printf("2.\tEnter name of output file (currently not set)\n"); printf("3.\tEnter number of characters data should be shifted (currently +7)\n"); printf("4.\tEncode the text\n\n"); printf("0.\tQuit\n\n"); printf("Make your selection: "); while( (scanf(" %d", &option) != 1) /* non-numeric input */ || (option  4)) /* number too large */ { fflush(stdin); /* clear bad data from buffer */ printf("That selection isn't valid. Please try again.\n\n"); printf("Your choice? "); } return option; } int input() { } int output() { return 2; } int shift() { return 3; } int encode() { return 4; } void quit() { printf("Quiting...Bye!"); exit(0); } 

No debe usar gets(user_filename) para obtener el nombre del archivo, ya que gets() lee hasta \n y deja de leer. Su scanf para la opción de menú no lee el \n al final de la línea cuando el usuario escribe en la opción de menú. Esencialmente, estás haciendo leer una cadena sin palabras en ella. La línea que desea leer es en realidad la siguiente línea. Usar scanf lugar de gets lo arreglará.

De lo contrario, su progtwig está funcionando como se esperaba, es solo que sus funciones no hacen nada aún, y su menú está “sobrescribiendo” los submenús. Consulte http://ideone.com/F2pEs para una implementación con scanf lugar de gets .

utilizar getchar (); poco después de los gets (nombre_de_usuario); esperará a obtener el personaje

  gets(user_filename); getchar(); break; 

Como en esta pregunta que Stackoverflow ha resaltado como una coincidencia, debe borrar el búfer para eliminar la nueva línea que está esperando allí.

Agregue este código después de leer una opción de menú válida:

 do { c = getchar(); } while (c != EOF && c != '\n'); 

donde c es un char declarado por option . Esto recorre los caracteres restantes en el flujo de entrada hasta que se alcanza EOF (Fin del archivo) o un carácter de nueva línea, lo que significa que no afectan su llamada a gets() . Tenga en cuenta que gets() se considera inseguro porque no protege contra el desbordamiento del búfer, un usuario podría ingresar fácilmente más de 100 caracteres (inc. Nueva línea) y comenzar a escribir en la memoria que no debería tocarse con su entrada. Harías bien en buscar el equivalente seguro cuando veas advertencias del comstackdor en torno a llamadas de funciones como esta, por lo general toman un segundo parámetro que es el tamaño máximo del búfer que se está leyendo.

Bueno, esta respuesta es demasiado tarde, pero al encontrarla, no puedo evitar escribir algo. Vamos directamente a ello. Tendrá una variedad de menús, con los elementos de la matriz como las opciones que desea en su menú. Luego, mientras se encuentra en una condición de verdad, recorra los elementos de la matriz y seleccione la opción que desee.

 #include "stdio.h" #include "stdlib.h" #include "string.h" //function prototypes int input(); int output(); int shift(); int encode(); void quit(); int main(){ int menus_on = 1; const char *menus[5] = {"Input","Output","Shift","Encode","Quit"}; while(menus_on){ int menu,*temp; for(int i =0;i<6;i++){ printf("%d: %s\n",i,menus[i]); } printf("Select menu\n"); scanf("%d",temp); menu = *temp; printf("Selected menu::%d\n",menu); switch(menu){ case 0: input(); break; case 1: output(); break; case 2: shift(); break; case 3: encode(); break; case 4: quit(); break; default: printf("Invalid selection\n"); break; } } return 0; } int input() { return 0; } int encode () { return 0; }