The following is the code for a simple menu. If the user enters an invalid option (4 or ‘o’) the menu should be reprinted displaying an error message. The code works when the user inputs a number, however it fails (looping indefinitely) when the user inputs a letter or string into option. My guess is that memory is being overwritten in the looping cases generating the strange behavior. Could someone help me to fix it?
Thank You
int inmenu = 1;
while (inmenu){
//Menu
printf("User: %s %s\n", user.firstname, user.lastname);
printf("0) Exit\n1) List Friends\n2) Add Friend\n3) Delete Friend\nWhat would you like to do? ");
int option;
scanf("%i", &option);
if(option == 0)
inmenu = 0;
else if (option == 1)
defaultPrint(friends, numfriends, NULL);
else if (option == 2){
//addfriend
char *name = (char *) malloc(sizeof(char) * 256);
int birthdate;
printf("Enter first name: ");
scanf("%s", name);
printf("Enter last name: ");
scanf("%s", name);
printf("Enter birthdate: ");
scanf("%i", &birthdate);
}
else if (option == 3){
//deletefriend
defaultPrint(friends, numfriends, NULL);
int n;
printf("What friend would you like to delete? ");
scanf("%i", &n);
}
else
printf("ERROR: Invalid option %i\n", option);
}
Test input:
0) Exit
1) List Friends
2) Add Friend
3) Delete Friend
What would you like to do? 4
ERROR: Invalid option 4
0) Exit
1) List Friends
2) Add Friend
3) Delete Friend
What would you like to do?
(correct behavior)
0) Exit
1) List Friends
2) Add Friend
3) Delete Friend
What would you like to do? o
What would you like to do? ERROR: Invalid option 4
0) Exit
1) List Friends
2) Add Friend
3) Delete Friend
...
(incorrect behavior keeps printing the same last 5 lines in an infinite loop)
The cause of your problem is that
scanf()doesn’t consume the input stream if it doesn’t match the requested format.This means that when you call:
If the user enters something other than a number (like
"o"), then that user input remains in the input stream – so when you loop around and callscanf()again, the"o"is still there, and still doesn’t match the requested format.This is why
scanf()is not particularly suitable for taking user input – it’s designed for consuming well-formatted data files. Instead, since you have a line-oriented user interface, you should read an entire line from the user withfgets(), then try parsing it withsscanf(). If it doesn’t parse correctly, you can report an error and then read a new line from the user.