Уходит в рекурсию scanf
При введении символа уходит в рекурсию, нужно что бы считала только числа, как избежать рекурсии в данном коде
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void startMenu(){ //В нем выдается стартовое меню
printf("---------------------Main Menu---------------------\n");
printf("This is the phone book of the company 'YptRemont'\n");
printf("What do you want to do?\n");
printf("1. View book\n");
printf("2. Find by ...\n");
printf("3. Book editor\n");
printf("4. Exit\n");
printf("---------------------Main Menu---------------------\n");
getsVvod(); //вызом метода ввода
}
void getsVvod(){
int vvod;
char str[80];
scanf("%d", &vvod); //Считываем ввод пользователя
if (vvod == 1) //если ввод равен 1 то вызываем метод ViewBook
{
ViewBook();
}
else if (vvod == 2) //если ввод равен 2 то вызываем метод FindBy
{
FindBy();
}
else if (vvod == 3) //если ввод равен 3 то вызываем метод BookEditor
{
BookEditor();
}
else if (vvod == 4) //если ввод равен 4 то вызываем метод Exit
{
Exit();
}
else // Если не одна из функция не сработала вывод "Ошибки" и запуск метода заново
{
printf("\n \n \nI do not know such a team, return\n \n \n");
startMenu();
}
}
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
Проверяйте результат scanf, а неверный ввод сбрасывайте... Что-то типа
while(fgetc(stdin) != '\n');
или
scanf("%*[^\n]");
или
scanf("%*c");
Если вы ввели не число - введенное остается в буфере и будет постоянно мешать при очередном вызове...
Автор решения: olegen
→ Ссылка
Предыдущий ответ частично верный ... при использовании именно sscanf() надо неверный ввод сбрасывать. Но рекурсия возникает еще и потому, что у вас она явно указана: startMenu() -> getsVvod() -> startMenu() .... и.т.д. Надо убрать вызов startMenu() из getsVvod()
Попробуйте как-то так:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LOOP_MENU 1
#define LOOP_QUIT 2
void ViewBook() { printf("Call: ViewBook\n"); }
void FindBy() { printf("Call: FindBy\n"); }
void BookEditor() { printf("Call: BookEditor\n"); }
void Exit() { printf("Call: Exit\n"); }
void getsVvod();
void startMenu(){ //В нем выдается стартовое меню
do {
printf("---------------------Main Menu---------------------\n");
printf("This is the phone book of the company 'YptRemont'\n");
printf("What do you want to do?\n");
printf("1. View book\n");
printf("2. Find by ...\n");
printf("3. Book editor\n");
printf("4. Exit\n");
printf("---------------------Main Menu---------------------\n");
} while (getsVvod() != LOOP_QUIT); //вызом метода ввода
}
void getsVvod(){
int vvod, ret;
//Считываем ввод пользователя
if ((ret = scanf("%d", &vvod)) != 1) {
printf("Bad input\n");
while(fgetc(stdin) != '\n');
return(LOOP_MENU);
}
switch (vvod) {
case 1: ViewBook();
break;
case 2: FindBy();
break;
case 3: BookEditor();
break;
case 4: Exit();
return(LOOP_QUIT);
default:
printf("\n \n \nI do not know such a team, return\n \n \n");
}
return(LOOP_MENU);
}
int main () {
startMenu();
}