Простой калькулятор в C поток ввода пропуская через scanf()
Я попытался написать свой первый калькулятор и нашел в Интернете несколько примеров, которые я затем изменил, чтобы упростить их с точки зрения динамики. Однако, когда я изменяю поток из этого:
#include <stdio.h>
main()
{
char operator;
float num1,num2;
printf("Enter an operator (+, -, *, /): ");
scanf("%c" ,&operator);
printf("Enter first operand: ");
scanf("%f" ,&num1);
printf("Enter second operand: ");
scanf("%f" ,&num2);
switch(operator)
{
case '+':
printf("num1+num2=%.2f\n" ,num1+num2);
break;
case '-':
printf("num1-num2=%.2f\n" ,num1-num2);
break;
case '*':
printf("num1*num2=%.2f\n" ,num1*num2);
break;
case '/':
printf("num1/num2=%.2f\n" ,num1/num2);
break;
default: //of operator is other than +, -, *, /, erros message shown
printf("Error! Invalid operator, this is basic math only.\n");
}
return 0;
}
к этому:
#include <stdio.h>
main()
{
char operator;
float num1,num2;
printf("Enter first operand: ");
scanf("%f" ,&num1);
printf("Enter an operator (+, -, *, /): ");
scanf("%c" ,&operator);
printf("Enter second operand: ");
scanf("%f" ,&num2);
switch(operator)
{
case '+':
printf("num1+num2=%.2f\n" ,num1+num2);
break;
case '-':
printf("num1-num2=%.2f\n" ,num1-num2);
break;
case '*':
printf("num1*num2=%.2f\n" ,num1*num2);
break;
case '/':
printf("num1/num2=%.2f\n" ,num1/num2);
break;
default: //of operator is other than +, -, *, /, erros message shown
printf("Error! Invalid operator, this is basic math only.\n");
}
return 0;
}
в основном изменился поток с: введите оператор, затем введите первый номер, затем второй номер. Кому: введите первый номер, затем введите оператора, затем введите второй номер. Моя проблема в том, что когда я это делаю, я вижу оператора Enter, но программа пропускает опцию ввода оператора и запрашивает: введите первый номер, затем введите второй номер. Ответ является переключателем по умолчанию.
3 ответа
Новая строка слева во входном буфере.
Когда используешь scanf("%f",...
, %f
потреблять начальные пробелы, но не ставить пробелы после числа - обычно \n
,
Когда используешь scanf("%c",...
, %c
не использует начальные пробелы и не ставит пробелы после char
или.
Потреблять оставшиеся пробелы (например, \n
из предыдущего scanf()
), простой предшествующий %c
с пробелом.
// scanf("%c" ,&operator);
scanf(" %c" ,&operator); // add space.
Новая строка, которую вы вводите после scanf
читает ваш первый оператор берется вторым scanf
звонки. Смотрите этот вопрос для более подробного объяснения.
Короче говоря, напишите такую функцию и вызывайте ее после каждого scanf
вызов.
void clear_stdin(void)
{
while(getchar() != '\n');
}
Это потому, что символ новой строки остается в буфере при вводе ввода первого scanf
так что следующее scanf
получить его как вход, просто положить getchar()
после каждого scanf()
это решит это