2013-07-05 2 views
0

В приведенном ниже коде, если пользователь вводит 1 или 2, все происходит гладко.Устранение ошибки <ENTER> необходимо для продолжения цикла

Но если я ввожу что-нибудь еще, кроме 1 или 2, цикл работает, но для продолжения цикла требуется дополнительное.

Как устранить необходимость в этом?

#include <stdio.h> 
#include <ctype.h> 
#include <math.h> 

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

void entry1(){ 

    char chArr[BUFSIZ]; 
    char choice, ch; 
    int choiceint, rating; 

    do{ 

    printf("1.\tZoo\n2.\tMall\n3.\tExit\n\n"); 
    printf("Choose a place by entering its numerical value: "); 

    fgets(chArr,sizeof(chArr),stdin); 
    sscanf(chArr, " %c", &choice); 

    // converts scanned char to int 
    choiceint = choice - '0'; 

     if(!isdigit(choice) || choiceint > 3){ 
      printf("You did not enter an accepted digit.\n"); 
     } 
     else if(choiceint != 3){ 
      switch(choiceint){ 
        case 1: 
         printf("You chose the Zoo.\n"); 
         printf("your rating : "); 
         scanf("%d", &rating); 
         break; 
        case 2: 
         printf("You chose the Mall.\n"); 
         printf("your rating : "); 
         scanf("%d", &rating); 
         break; 
      }// end of switch 
     }// end of else if 
      else{ 

      }// end of else 

    clearKeyboardBuffer(); 

    }// end of do 
    while(choiceint !=3); 

} 
+0

возможного дубликата из [Нет новой строки после ввода в C] (http://stackoverflow.com/questions/2710103/no-newline-after-input-in-c) – unwind

ответ

1

просто переместить вызов clearKeyboardBuffer() сразу после // конца выключателя, как в

char chArr[BUFSIZ]; 
char choice, ch; 
int choiceint, rating; 

do{ 

     printf("1.\tZoo\n2.\tMall\n3.\tExit\n\n"); 
     printf("Choose a place by entering its numerical value: "); 

     fgets(chArr,sizeof(chArr),stdin); 
     sscanf(chArr, " %c", &choice); 

     // converts scanned char to int 
     choiceint = choice - '0'; 

     if(!isdigit(choice) || choiceint > 3){ 
       printf("You did not enter an accepted digit.\n"); 
     } 
     else if(choiceint != 3){ 
       switch(choiceint){ 
         case 1: 
           printf("You chose the Zoo.\n"); 
           printf("your rating : "); 
           scanf("%d", &rating); 
           break; 
         case 2: 
           printf("You chose the Mall.\n"); 
           printf("your rating : "); 
           scanf("%d", &rating); 
           break; 
       }// end of switch 
     clearKeyboardBuffer(); 
     }// end of else if 
     else{ 

     }// end of else 


}// end of do 
while(choiceint !=3); 
0

У вас возникла проблема с петлей if else. Если выбор не является цифра или> 3 вы хотите повторно задать пользователю

#include <stdio.h> 
#include <ctype.h> 
#include <math.h> 

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

void entry1(){ 

    char chArr[BUFSIZ]; 
    char choice, ch; 
    int choiceint, rating; 

    do{ 

    printf("1.\tZoo\n2.\tMall\n3.\tExit\n\n"); 
    printf("Choose a place by entering its numerical value: "); 

    fgets(chArr,sizeof(chArr),stdin); 
    sscanf(chArr, " %c", &choice); 

    // converts scanned char to int 
    choiceint = choice - '0'; 

     if(!isdigit(choice) || choiceint < 1 || choiceint > 3){ 
      printf("You did not enter an accepted digit.\n"); 
     } 
     // If 0 > choice > 3 
     else { 
      switch(choiceint){ 
        case 1: 
         printf("You chose the Zoo.\n"); 
         printf("your rating : "); 
         scanf("%d", &rating); 
         break; 
        case 2: 
         printf("You chose the Mall.\n"); 
         printf("your rating : "); 
         scanf("%d", &rating); 
         break; 
        case 3: 
         break; 
        default: 
         break; 
      }// end of switch 
     }// end of else 


    clearKeyboardBuffer(); 

    }// end of do 
    while(choiceint !=3); 

} 
+0

Это сокращает код, но это не решает проблему. Спасибо anyway =) – iridescent

+0

О, извините за это :) –

+0

Не беспокойтесь, я попытался использовать сокращенный оператор switch с изменением положения clearKeyboardBuffer(), как это предложено в выбранном ответе, но ключ «enter» по-прежнему требуется. .. Интересно, почему ? Он тоже должен работать = / – iridescent

Смежные вопросы