2

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;
    }
}
4

1 に答える 1

0

scanf_s("%c", &valinta);別のパラメーターが必要です。@マフソ

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

前にスペースを追加すると、"%c"コードが再度呼び出される場合に役立ちますscanf_s(" %c", &valinta);

「 fscanf_s 関数は、 c 、 s 、および [ 変換指定子が引数のペアに適用されることを除いて、 fscanf と同等です(割り当ての抑制が * で示されている場合を除く)。これらの引数の最初の引数は、fscanf の場合と同じです。その引数引数リストの直後に2 番目の引数が続きます。この引数は rsize_t 型で、ペアの最初の引数が指す配列の要素数を示します。」

C11dr §K.3.5.3.2 4


fflush(stdin);移植性がなく、期待どおりに動作しない可能性があるため、ドロップすることをお勧めします。

于 2014-09-14T17:10:43.803 に答える