Следующий printf приходит до того, как мой scanf принимает данные - PullRequest
1 голос
/ 03 апреля 2020

Я создаю файл калькулятора в C с оператором while l oop и switch. В первый раз через while l oop все работает нормально, но когда он проходит через второй раз, вызывается my printf, прежде чем у меня появляется возможность ввести данные в предыдущий scanf.

Я пытался использовать '\n' перед текстом в printf, и я также пытался использовать fflush(stdout) до и после вызова scanf.

Токовый выход:

Welcome to the Calculator  
Operation choices:  Addition(A)
                    Subtraction(S)
                    Multiplication(M)
                    Division(D).  
Enter choice: A  
Enter both numbers in required sequence: 50 50  
// the output of the calculator does <>= 100 // Equal to 100.   
Welcome to the Calculator  
Operation choices:  Addition(A)
                    Subtraction(S)
                    Multiplication(M)
                    Division(D).  
Enter choice: Enter both numbers in required sequence:  

Что я хочу:

Welcome to the Calculator  
Operation choices:  Addition(A)
            Subtraction(S)
            Multiplication(M)
            Division(D).  

Enter choice: A 

Enter both numbers in required sequence: 50 50  
// the output of the calculator does <>= 100 // Equal to 100.   
Welcome to the Calculator  
Operation choices:  Addition(A)
            Subtraction(S)
            Multiplication(M)
            Division(D).  
Enter choice: // then I can enter a new choice for the switch //

Код, который я пробовал:

while(input != 'q'){
    printf("Welcome to the Calculator\nOperation choices:\tAddition(A)\n\t\t\tSubtraction(S)\n\t\t\tMultiplication(M)\n\t\t\tDivision(D)\nEnter choice: ");
    fflush(stdout);
    scanf("%c", &input);
    fflush(stdout);
    printf("\nEnter both numbers in required sequence: ");
    scanf("%f %f", &num1, &num2);

    switch(input){
    case 'A':
      result = num1 + num2;
      break;
    case 'S':
      result = num1 - num2;
      break;
    case 'M':
      result = num1 * num2;
      break;
    case 'D':
      result = num1 / num2;
      break;
    default:
      printf("Please choose a valid operation.");
      break;
    }

    if(result > 100){
      printf("Greater than 100.\n");
    }
    else if(result < 100) {
      printf("Less than 100.\n");
    }
    else{
      printf("Equal to 100.\n");
    }
  }
  printf("Quit the menu.\n");
  return(0);
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Последовательность событий в вашей программе правильная, в результате scanf() считывает символ новой строки '\n', который остается в буфере stdin предыдущего ввода. '\n' используется scanf(), и программа продолжает выполнение.

Вам необходимо очистить буфер перед выполнением scanf().

Опция 1 - Очистить буфер в нижней части цикла while:

//...
int c;
//...
else{
  printf("Equal to 100.\n");
}
while((c = fgetc(stdin)) != '\n' && c != EOF){}
//...

Опция 2 (проще) - Использовать пробел перед спецификатором %c:

scanf(" %c", &input);
       ^
1 голос
/ 03 апреля 2020

Попробуйте: scanf(" %c", &input); (добавьте пробел перед %c)

scanf, скорее всего, будет принимать \n в буфере в качестве ввода и помещать в ваш символ input.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...