Не понимаю логику работы ввода & вывода. Не считывается символ 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;
}

Я хотел в качестве небольшой практики написать простенький калькулятор с двумя операндами и одной операцией и столкнулся со следующей проблемой: первый операнд считывается, второй операнд считывается, а считывание оператора пропускается.

Способ решения проблемы мне известен. Хотелось бы получить объяснение того, как работает механизм ввода & вывода в рамках кода, представленного в начале вопроса и почему этот эффект происходит. Вот, как я это понимаю, а вы поправьте:

Мой взгляд на ввод & вывод

  1. При первом вызове scanf("%d") управление передается оболочке для обеспечения ввода данных.
  2. Совершается нажатие на клавиатуру и символ тут же присваивается переменной, адрес которой указан во втором параметре.
  3. Вызывается второй printf("Second operand: "), но данные не выводятся, а отправляются в буфер вывода.
  4. Пользователь нажимает Enter и для оболочки это сигнал вывести данные из буфера вывода. На экран выводится что-то вроде First operand: 14.
  5. Затем программа запрашивает при втором вызове scanf() второе число, но почему? Туда ведь должен был записаться символ переноса строки, как это произошло в случае с scanf("%c") при запрашивании оператора?

Может, я что-то неправильно понимаю? И объясните, пожалуйста, как работает и что такое буфер ввода. Логику буфера вывода понимаю, а ввода - нет.

UPD: И еще вопрос. Попробовал изменить весь ввод данных на следующее:

int firstOperand, secondOperand, operator;
scanf("%d %c%d", firstOperand, operator, secondOperand);

Чтобы можно было ввести что-то вроде: 5 + 4 Так почему же символ все равно не считывается? Вернее, считывается, но туда попадает ASCII символ с кодом 8?


Ответы (0 шт):