Не понимаю логику работы ввода & вывода. Не считывается символ char
#include <stdio.h>
int main()
{
int firstOperand, secondOperand;
float result;
printf("First operand: ");
scanf("%d", &firstOperand);
printf("Second operand: ");
scanf("%d", &secondOperand); // <-- Ошибка здесь
printf("Operator: ");
int operator = scanf("%c", &operator);
switch (operator) {
case '+':
printf("\n%d + %d = %d", firstOperand, secondOperand, firstOperand + secondOperand);
break;
case '-':
printf("\n%d - %d = %d", firstOperand, secondOperand, firstOperand - secondOperand);
break;
case '*':
printf("\n%d * %d = %d", firstOperand, secondOperand, firstOperand * secondOperand);
break;
case '/':
if (secondOperand == 0) {
printf("\nError!");
break;
}
printf("\n%d / %d = %.2f", firstOperand, secondOperand, (float)firstOperand / (float)secondOperand);
break;
}
return 0;
}
Я хотел в качестве небольшой практики написать простенький калькулятор с двумя операндами и одной операцией и столкнулся со следующей проблемой: первый операнд считывается, второй операнд считывается, а считывание оператора пропускается.
Способ решения проблемы мне известен. Хотелось бы получить объяснение того, как работает механизм ввода & вывода в рамках кода, представленного в начале вопроса и почему этот эффект происходит. Вот, как я это понимаю, а вы поправьте:
Мой взгляд на ввод & вывод
- При первом вызове
scanf("%d")
управление передается оболочке для обеспечения ввода данных. - Совершается нажатие на клавиатуру и символ тут же присваивается переменной, адрес которой указан во втором параметре.
- Вызывается второй
printf("Second operand: ")
, но данные не выводятся, а отправляются в буфер вывода. - Пользователь нажимает
Enter
и для оболочки это сигнал вывести данные из буфера вывода. На экран выводится что-то вродеFirst operand: 14
. - Затем программа запрашивает при втором вызове
scanf()
второе число, но почему? Туда ведь должен был записаться символ переноса строки, как это произошло в случае сscanf("%c")
при запрашивании оператора?
Может, я что-то неправильно понимаю? И объясните, пожалуйста, как работает и что такое буфер ввода. Логику буфера вывода понимаю, а ввода - нет.
UPD: И еще вопрос. Попробовал изменить весь ввод данных на следующее:
int firstOperand, secondOperand, operator;
scanf("%d %c%d", firstOperand, operator, secondOperand);
Чтобы можно было ввести что-то вроде: 5 + 4
Так почему же символ все равно не считывается? Вернее, считывается, но туда попадает ASCII символ с кодом 8?