Простой калькулятор в 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() это решит это

Другие вопросы по тегам