Не удается заставить работать scanf_s или переключатель

У меня проблемы с функцией scanf_s(); функции или функции переключения, при первом запуске кода он не распознает правильный символ и возвращается к началу, но после этого он работает нормально. Это простой калькулятор.

Вероятно, для этого есть какое-то простое решение, поскольку я только начал изучать программирование, но я не могу его найти.

Весь текст на финском, но надеюсь сам код понятен.

Все отзывы приветствуются, так как я очень хочу узнать, что я должен и не должен делать.

#include <stdio.h>
#include <stdlib.h>

float luku1 = 0;
float luku2 = 0;
float tulos = 0;
char valinta = '\0';

int main()
{
    system("cls");
    printf("Minkä laskusuorituksen haluaisit tehdä? (+,-,*,/)\n");
    fflush(stdin);
    scanf_s("%c", &valinta);
    switch (valinta){
    case '+':
        printf("Anna yhteenlaskettavat luvut.\n>");
        scanf_s("%f %f", &luku1, &luku2);
        tulos = luku1 + luku2;
        printf("Lukujen summa on %4.2f\n", tulos);
        break;
    case '-':
        printf("Anna vähennettävät luvut.\n>");
        scanf_s("%f %f", &luku1, &luku2);
        tulos = luku1 - luku2;
        printf("Lukujen summa on %4.2f\n", tulos);
        break;
    case '*':
        printf("Anna kerrottavat luvut.\n>");
        scanf_s("%f %f", &luku1, &luku2);
        tulos = luku1 * luku2;
        printf("Lukujen tulo on %4.2f\n", tulos);
        break;
    case '/':
        printf("Anna jaettavat luvut.\n>");
        scanf_s("%f %f", &luku1, &luku2);
        if (luku2 == 0)
        {
            printf("Nollalla ei voida jakaa.\n");
            system("pause");
            main();
        }
        else
        {
            tulos = luku1 / luku2;
            printf("Lukujen jako on %4.2f\n", tulos);
        }
        break;
    default:
        printf("En tunnistanut laskutoimitusta, yritä uudelleen.\n");
        system("pause");
        main();
        break;
    }
}

person Suff0cat1on    schedule 14.09.2014    source источник
comment
Научитесь пользоваться отладчиком.   -  person Jonathan Wood    schedule 14.09.2014
comment
Используйте возвращаемое значение, полученное от scanf() [и избегайте нестандартных функций, таких как scanf_s()]   -  person wildplasser    schedule 14.09.2014
comment
Во время отладки после scanf_s он переходит непосредственно к регистру по умолчанию независимо от ввода.   -  person Suff0cat1on    schedule 14.09.2014
comment
Используйте scanf, пожалуйста, и это сработает.   -  person Igor    schedule 14.09.2014
comment
В новой визуальной студии нельзя использовать scanf, поэтому я использую scanf_s.   -  person Suff0cat1on    schedule 14.09.2014
comment
Можете ли вы попробовать scanf_s(" %c", &valinta);, потому что иногда буфер заполнен, и fflush(stdin) не поможет.   -  person Igor    schedule 14.09.2014
comment
Используйте #define _CRT_SECURE_NO_WARNINGS или вообще не используйте scanf, вместо этого используйте getchar/fgets/... и sscanf/strtol/.... Насколько я знаю, scanf_s нужен дополнительный аргумент размера для конверсий c, s и [.   -  person mafso    schedule 14.09.2014
comment
Действительно, не используйте scanf_s. Раньше это был нестандартный и неуклюжий интерфейс, предоставляемый только Microsoft с их компилятором, а теперь это столь же неуклюжий интерфейс, спрятанный в необязательном приложении к стандарту, и, насколько мне известно, до сих пор не поддерживается нигде, кроме MSVC.   -  person R.. GitHub STOP HELPING ICE    schedule 14.09.2014


Ответы (1)


scanf_s("%c", &valinta); нужен еще один параметр. @мафсо

 scanf_s(" %c", &valinta, 1);

Добавление пробела перед "%c" поможет при повторном вызове кода scanf_s(" %c", &valinta);.

«Функция fscanf_s эквивалентна fscanf, за исключением того, что спецификаторы преобразования c, s и [ применяются к паре аргументов (если только подавление присваивания не указано *). Первый из этих аргументов — это то же, что и для fscanf. За этим аргументом сразу же следует в списке аргументов второй аргумент, который имеет тип rsize_t и дает количество элементов в массиве, на который указывает первый аргумент пары."

C11dr §K.3.5.3.2 4


Рекомендую отказаться от fflush(stdin);, так как он не переносим и может/не может работать должным образом.

person chux - Reinstate Monica    schedule 14.09.2014
comment
Это правильно, но лучше вообще не использовать scanf_s. - person R.. GitHub STOP HELPING ICE; 14.09.2014
comment
@R.. Согласен насчет scanf_s() - я предпочитаю fgets() для всего пользовательского ввода. - person chux - Reinstate Monica; 14.09.2014
comment
Спасибо, долго мучился с этим. - person Suff0cat1on; 14.09.2014