2015-11-17 4 views
0

Для практики я пишу программу, которая выступает в качестве главного меню. Я хочу, чтобы пользователь выбирал один из вариантов. Он отлично работает, когда пользователь вводит целое число, но, когда персонаж вводится печатает этотВывод «бесконечно» при вводе символа вместо цифры

enter image description here

бесконечно, а не просто печать «Invalid ...», а затем просить другой вход.

#include <stdio.h> 
#include <conio.h> 

int main() 
{ 
     int menu_choice, User_Num, MENU, count; 
     MENU=1; 

     do 
     { 
       printf(" *---------------------------------------*\n"); 
       printf(" |          |\n"); 
       printf(" | 1. Individual  2. Group  3.Exit |\n"); 
       printf(" |          |\n"); 
       printf(" *---------------------------------------*\n\n"); 

       printf(" -----------------------------------------------------------------\n"); 
       printf("| Type '1' if you want to enter as an individual     |\n"); 
       printf("| Type '2' if you want to know enter as a group      |\n"); 
       printf("| Type '3' if you want to to stop the program      |\n"); 
       printf(" -----------------------------------------------------------------\n"); 
       printf("What is your choice?"); 
       scanf(" %d", &menu_choice); 

       if (menu_choice==1) 
       {   
         User_Num=1; 
         printf("Accepted\n"); 
       } 

       else if (menu_choice==2) 
       { 
         do 
         { 
           printf("How many users?: "); 
           scanf(" %d", &User_Num);   

           if (User_Num<2) 
             printf("Invalid Input. Try Again \n"); 
         } while (User_Num<2); 

         printf("Accepted\n"); 
       } 

       else if (menu_choice==3) 
       { 
         printf("Good Bye and Thank You");   
         MENU=0;     
       } 

       else 
       { 
         printf("Invalid Input. Try Again \n"); 
       } 

     } while (MENU); 

     getch(); 
} 
+1

Вам нужно очистить оставшееся недействительное _feed_ до scanf(). –

ответ

2

Когда scanf видит входные данные, которые не могут быть разобраны в соответствии с форматом, то он просто оставляет вход в буфере, он не удаляет его. Поэтому, если вы попытаетесь использовать scanf в цикле, следующая итерация scanf увидит тот же самый ввод, который он не смог проанализировать в прошлый раз, и так далее.

Поэтому я рекомендую вам прочитать всю строку, используя fgets, в буфер и использовать sscanf для анализа собственного буфера. И вам нужно проверить, что возвращает sscanf, чтобы узнать, удалось ли ему что-либо разобрать.

+0

Извините, что задал этот вопрос, поэтому добавить это было бы достаточно или я все еще что-то пропустил? char buffer [128]; fgets (buffer, 128, stdin); sscanf (буфер, "% d", & menu_choice); – TheYellowOcean

+0

@ TheYellowOcean Да, этого должно быть достаточно. Но я по-прежнему рекомендую вам проверить, что возвращает ['sscanf'] (http://en.cppreference.com/w/c/io/fscanf), чтобы убедиться, что он правильно проанализирует число или нет. –