Función de menú de llamada en otra función.

Estoy tratando de llamar a la función de menú en la función principal y dejar que aparezca hasta que el usuario decida salir, pero parece que no me está dando una respuesta. Soy nuevo en la encoding de este sitio web, avíseme si hay algo, por ejemplo. Post formato que puedo mejorar!

función clearkeyboard:

void clearKeyboard(void) { int c; while ((c = getchar()) != '\n' && c != EOF); } 

La función para llamar al menú:

 void ContactManagerSystem(void) { int contactchoice; int done = 1; char yesno, c; do { clearKeyboard(); contactchoice = menu(); switch (contactchoice) { case 1: printf("<<>>\n"); break; case 2: printf("<<>>\n"); break; case 3: printf("<<>>\n"); break; case 4: printf("<<>>\n"); break; case 5: printf("<<>>\n"); break; case 6: printf("<<>>\n"); break; case 0: printf("Exit the program? (Y)es/(N)o: "); scanf("%c%c", &yesno, &c); if (yesno == 'Y' || yesno == 'y' && c == '\n') { done = 0; break; } else if (yesno == 'N' || yesno == 'n') break; default: break; } } while (done == 1); } 

Función de menú:

 int menu(void) { int done = 1; int choice; char c; do { printf("Contact Management System\n"); printf("-------------------------\n"); printf("1. Display contacts\n"); printf("2. Add a contact\n"); printf("3. Update a contact\n"); printf("4. Delete a contact\n"); printf("5. Search contacts by cell phone number\n"); printf("6. Sort contacts by cell phone numbe\n"); printf("0. Exit\n\n"); printf("Select an option:> "); int rtn = scanf("%d%c", &choice, &c); if (rtn == EOF || rtn == 0 || c != '\n') clearKeyboard(); else if (choice >= 0 && choice <= 6 && c == '\n') done = 0; else { clearKeyboard(); printf("*** OUT OF RANGE *** : "); scanf("%d", &choice); } } while (done == 1); return choice; } 

La imagen adjunta a continuación es donde falla, la versión correcta debe hacer el caso 1 en lugar de mantener nuevamente el menú de solicitud.

Parte incorrecta

introduzca la descripción de la imagen aquí

¡¡¡Gracias por adelantado!!!

Hay dos problemas en su código.

  1. La función menu () devuelve int y usted hace coincidir int con char en el caso de cambio de case '1': debe ser el case 1:

  2. reemplazar debajo de la línea

scanf("%c%c", &yesno,&c); con scanf("%c%c", &c,&yesno);

Espero que esto te ayude.

Dos temas a mejorar.

1) Como el menu() devuelve un entero, el caso del switch debe tener enteros, no caracteres.

2)

  printf("Exit the program? (Y)es/(N)o: "); scanf("%c%c", &yesno, &c); 

Usted no usa c ;

scanf(" %c", &yesno); es suficiente.

 #include  void clearKeyboard(void) { int c; while ((c = getchar()) != '\n' && c != EOF); } void ContactManagerSystem(void) { int contactchoice; int done = 1; char yesno, c; do { contactchoice = menu(); switch (contactchoice) { case 1: printf("<<< Feature 1 is unavailable >>>\n"); break; case 2: printf("<<< Feature 2 is unavailable >>>\n"); break; case 3: printf("<<< Feature 3 is unavailable >>>\n"); break; case 4: printf("<<< Feature 4 is unavailable >>>\n"); break; case 5: printf("<<< Feature 5 is unavailable >>>\n"); break; case 6: printf("<<< Feature 6 is unavailable >>>\n"); case 0: printf("Exit the program? (Y)es/(N)o: "); scanf(" %c", &yesno); if (yesno == 'Y' || yesno == 'y') { done = 0; break; } else if (yesno == 'N' || yesno == 'n') break; default: break; } } while (done == 1); } int menu(void) { int done = 1; int choice; do { printf("Contact Management System\n"); printf("-------------------------\n"); printf("1. Display contacts\n"); printf("2. Add a contact\n"); printf("3. Update a contact\n"); printf("4. Delete a contact\n"); printf("5. Search contacts by cell phone number\n"); printf("6. Sort contacts by cell phone numbe\n"); printf("0. Exit\n\n"); printf("Select an option:> "); scanf("%d", &choice); if (choice >= 0 && choice <= 6) done = 0; else { clearKeyboard(); printf("*** OUT OF RANGE *** : "); scanf("%d", &choice); } } while (done == 1); return choice; } int main(void) { ContactManagerSystem(); return 0; } 

Salida:

 Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone numbe 0. Exit Select an option:> 1 <<< Feature 1 is unavailable >>> Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone numbe 0. Exit Select an option:> 0 Exit the program? (Y)es/(N)o: Y 

Sólo unas cuantas limpiezas adicionales. Debe determinar cómo manejar la entrada de cancelación del usuario generando un EOF manual con Ctrl + d (o Ctrl + z en windoze). Dado que está devolviendo un valor int , puede devolver fácilmente -1 para su caso EOF .

Además, ¿cuántas llamadas a printf necesitas hacer? Uno es suficiente, por ejemplo

 int menu (void) { int rtn, choice; /* scanf return, menu choice */ for (;;) { /* loop until valid input or EOF displaying menu */ printf ("\nContact Management System\n" "-------------------------\n" " 1. Display contacts\n" " 2. Add a contact\n" " 3. Update a contact\n" " 4. Delete a contact\n" " 5. Search contacts by cell phone number\n" " 6. Sort contacts by cell phone number\n" " 0. Exit\n\n" "Select an option:> "); rtn = scanf ("%d", &choice); /* save scanf return */ if (rtn == 1 && 0 <= choice && choice <= 6) /* good value, break */ break; else if (rtn == EOF) { /* user canceled input, return -1 */ fprintf (stderr, "(user canceled input).\n"); return -1; } empty_stdin(); /* empty_stdin for rtn = 0 case */ fprintf (stderr, " error: invalid input.\n"); } empty_stdin(); /* empty_stdin after good value */ return choice; /* return choice to user */ } 

La función de switch C proporciona un análisis de caso hasta que se encuentra una statement de break . Puede usar esto para su ventaja en su función de CMS hasta que complete todos los case: declaraciones. Puede continuar utilizando el método de interrupción para manejar el 0 - exit y manejar el retorno EOF (entrada cancelada por el usuario) desde el menu() , por ejemplo

 void cms (void) { for (;;) { /* loop continually calling menu */ int choice = menu(); char c; switch (choice) { case 1: case 2: case 3: /* use case-fallthrough until setup */ case 4: case 5: case 6: printf("<<< Feature %d is unavailable >>>\n", choice); break; case 0: printf ("exit program [y/n]: "); /* confirm exit */ if (scanf (" %c", &c) == EOF) { /* handle EOF */ fprintf (stderr, "(user canceled input).\n"); return; } empty_stdin(); if (c == 'N' || c == 'n') { /* handle no exit */ continue; break; } case -1: /* fallthrough yes exit or EOF in menu */ return; break; } } } 

En conjunto, puede crear un pequeño sistema de menús bastante robusto, por ejemplo,

 #include  void empty_stdin (void) { for (int c = getchar(); c != '\n' && c != EOF; c = getchar()) {} } int menu (void) { int rtn, choice; /* scanf return, menu choice */ for (;;) { /* loop until valid input or EOF displaying menu */ printf ("\nContact Management System\n" "-------------------------\n" " 1. Display contacts\n" " 2. Add a contact\n" " 3. Update a contact\n" " 4. Delete a contact\n" " 5. Search contacts by cell phone number\n" " 6. Sort contacts by cell phone number\n" " 0. Exit\n\n" "Select an option:> "); rtn = scanf ("%d", &choice); /* save scanf return */ if (rtn == 1 && 0 <= choice && choice <= 6) /* good value, break */ break; else if (rtn == EOF) { /* user canceled input, return -1 */ fprintf (stderr, "(user canceled input).\n"); return -1; } empty_stdin(); /* empty_stdin for rtn = 0 case */ fprintf (stderr, " error: invalid input.\n"); } empty_stdin(); /* empty_stdin after good value */ return choice; /* return choice to user */ } void cms (void) { for (;;) { /* loop continually calling menu */ int choice = menu(); char c; switch (choice) { case 1: case 2: case 3: /* use case-fallthrough until setup */ case 4: case 5: case 6: printf("<<< Feature %d is unavailable >>>\n", choice); break; case 0: printf ("exit program [y/n]: "); /* confirm exit */ if (scanf (" %c", &c) == EOF) { /* handle EOF */ fprintf (stderr, "(user canceled input).\n"); return; } empty_stdin(); if (c == 'N' || c == 'n') { /* handle no exit */ continue; break; } case -1: /* fallthrough yes exit or EOF in menu */ return; break; } } } int main (void) { cms(); return 0; } 

Ejemplo de uso / salida

Verificando los casos en que el usuario cancela la entrada en el menu() o en el exit program [y/n]: genera un EOF manual con Ctrl + d (o Ctrl + z en windoze):

 $ ./bin/scanf_menu_cms Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone number 0. Exit Select an option:> (user canceled input). $ ./bin/scanf_menu_cms Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone number 0. Exit Select an option:> 0 exit program [y/n]: (user canceled input). 

Bien, ahora verifique un caso de uso normal respondiendo No para salir, luego Sí:

 $ ./bin/scanf_menu_cms Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone number 0. Exit Select an option:> 4 <<< Feature 4 is unavailable >>> Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone number 0. Exit Select an option:> 0 exit program [y/n]: n Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone number 0. Exit Select an option:> 0 exit program [y/n]: y 

Finalmente un caso de entrada no válido:

 $ ./bin/scanf_menu_cms Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone number 0. Exit Select an option:> My dog has fleas! error: invalid input. Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone number 0. Exit Select an option:> -1 error: invalid input. Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone number 0. Exit Select an option:> 7 error: invalid input. Contact Management System ------------------------- 1. Display contacts 2. Add a contact 3. Update a contact 4. Delete a contact 5. Search contacts by cell phone number 6. Sort contacts by cell phone number 0. Exit Select an option:> 4 <<< Feature 4 is unavailable >>> 

Si bien no es un error, el estilo de encoding estándar para C evita el uso de los nombres de las variables camelCase o MixedCase en favor de todas las minúsculas, al tiempo que se reservan los mayúsculas para usar con macros y constantes. Es una cuestión de estilo, por lo que depende completamente de usted, pero no seguirlo puede llevar a la primera impresión incorrecta en algunos círculos.