0

case 1get inが完全に無視されている理由を誰か教えてもらえますか?

    // #define M 50 is at the top

    char product[M] = {0};
    int choice = -1;

    printf("Command: ");
    scanf("%d", &choice);

    switch(choice){

        case 0:
            break;

        case 1:
            printf("Product: ");
            gets(product);
            insert_product(warehouse, price, product);
            break;

        case 2:
            // print_all();
            break;

        default:
            printf("Scelta non valida\n");
            break;

    }
4

5 に答える 5

5

get は、前の入力からの終了文字によってスキップされる場合があります。getchar() の前に getchar() を追加してみて、それが問題かどうかを確認してください。

于 2012-05-31T20:31:26.017 に答える
1

まず、重要なビット...

絶対に絶対に絶対に使用しないgetsでください。これまで。練習用コードでも。たとえ他人に言われたとしても。映画のハイランダー IIのようなものです。存在しなかったふりをするのが最善です。C99 で廃止され、C2011 から完全に削除されました。使用しないでください。これが単なる練習用コードであると主張して、それを使用することを正当化しようとしないでください。他の誰かがあなたにそれを使用するように要求した場合は、押し返し、fgets代わりに使用することを伝えてください. 彼らがあなたを悲しませるなら、私に送ってください。必要に応じて野球のバットで。

さて、私はそれをクリアしたので...

gets前の呼び出しで入力した入力から末尾の改行を取得していscanfます。いくつかの選択肢があります:

  1. の代わりに別のscanf呼び出しを使用しますgets。今回は、%s変換指定子 (フィールド幅と共に) を使用します。とは異なりgets、先頭の改行文字をスキップします。

  2. を呼び出すgetchar()前に (または同等の) を呼び出して、改行を消費しますgets

  3. choiceを使用して整数として読み取る代わりに、scanfを使用してテキストとして読み取り、 を使用fgetsして整数に変換しstrtolます。

オプション 3 が最適な IMO です。scanf/ fscanfandの呼び出しを混在させるとfgets、通常、胸やけのレシピになります。これは、正確に末尾の改行の問題が原因です。すべてのためにどちらか一方に固執することをお勧めします。を使用してすべてをテキストとして読み取る利点はfgets、特に数値入力の場合に、入力の検証が容易になることです。

于 2012-05-31T21:00:24.297 に答える
1

問題は、読み取り時に入力する改行ですchoice

scanf("%d", &choice);

次の入力として取得されているgets(product);ため、空の文字列を読み取ります。改行を吸収するために人為的なgetcharafterを追加してみてください:scanf

scanf("%d", &choice);
getchar();

今すぐ動作するはずです。

于 2012-05-31T20:35:09.493 に答える