Switch странно проводит выбор после введения целочисленного значения

Выполняю задачу 4.28 по учебнику Дейтела. Задача кажется простой, но при написании кода терминал выдаёт беспорядочную последовательность оператора. Если ввести '100', то сначала будет выбран первый случай, а затем default. Не сработал оператор break, затем почему-то возвращается первый случай, пропускается оператор ввода значения, и так далее. В общем, оператор работает не так, как надо. Учусь самостоятельно, ютуб, гугл, учебники не дали ответа. Задачу не перепрыгиваю, нужно в азах понять принцип оператора switch. Пожалуйста, помогите понять, думаю, логическую ошибку. Спасибо.

Задача

#include <stdio.h>
int main()
{
    float sum = 0, salary = 0;
    int grade = 0, additional = 0;
    
    printf("Please, enter the number 1-4 of workers type to calculate sum of salaries:\n");
    while ( (grade = getchar ()) != EOF) {
        switch (grade) {
            case '1': 
                printf("Please, enter salary amount of worker:\n");
                scanf("%f", &salary);
                printf("The salary amount for worker is %f\n", salary);
                sum+=salary;
                printf("Here is clear\n");
                break;
            case '2': 
                printf("Please, enter salary amount of worker:\n");
                scanf("%f", &salary);
                printf("Please, enter amount of overhours of worker:\n");
                scanf("%d", &additional);
                salary += (salary * (salary/40) * additional); 
                printf("The salary amount for worker is %f\n", salary);
                sum+=salary;
                break; 
            case '3': 
                printf("Please, enter costs of sold goods:\n");
                scanf("%d", &additional);
                salary = 250 + (float) (additional/100) * 5.7;
                printf("The salary amount for worker is %f\n", salary);
                sum+=salary;
                break;
           case '4': 
                printf("Please, enter price for 1 produced part by worker:\n");
                scanf("%f", &salary);
                printf("Please, enter amount of produced parts by worker:\n");
                scanf("%d", &additional);
                salary = (float) salary * additional;
                printf("The salary amount for worker is %f\n", salary);
                sum+=salary;
                break;
            default : 
                printf("You wrote incorrect number of worker type. Enter again.\n");
                break;
        }
    }
    printf("The final amount of money to pay: %f", sum);        
    return 0;
}

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

Автор решения: AnyKeyShik

Добро пожаловать на Ru StackOverflow.

Вы используете функцию getchar(), которая считывает один символ с потока ввода. Скорее всего, вы запускаете программу в консоли и взаимодействуете с ней через нее - то есть вводите числа, потом нажимаете Enter. В таком случае у вас в буфере ввода оказывается символ \n (в случае *NIX-систем) или \n\r (в случае Windows). Он влияет на scanf() в switch.

К вашему вопросу - в случае, когда вы вводите число 100 в буфере обмена оказывается последовательность символов 100\n, которую getchar() обрабатывает посимвольно, после чего все остальное предоставляется scanf(). То есть, как будет работать программа на таком вводе: getchar() считывает первый символ, это 1. Переходит в ветку, отвечающую этому выбору. В этот момент в буфере остались 00\n. В ветке scanf() забирает из буфера все числа - то есть последовательность 00, в буфере остается \n, который, после завершения ветки, и получает getchar(), после чего идет переход в ветку default и мы получаем сообщение о некорректном вводе варианта.

Если вы хотите делать через строки (хотя, по-моему, в данном случае проще будет действовать через ввод числа и его проверку), то можно попробовать переписать ваш код через fgets()/scanf() с модификатором %c

→ Ссылка