1
#include <stdio.h>
void load_menu(void);

int main(void)
{
    load_menu();
    return 0;
}

void load_menu(void)
{
int choice;
int loopagain;

do
{
    printf("Menu \n\n");
    printf("Please enter your choice: \n");
    printf("1. \n");
    printf("2.\n");
    printf("3.\n");
    printf("4. Exit\n");
    if (scanf("%d",&choice)==1)
    {

        switch(choice)
        {
            case 1:
                    break;
            case 2:
                    break;
            case 3:
                    break;
            case 4: printf("Quitting program!\n");
                    break;
            default: printf("Invalid choice! Please try again\n");
                    printf("\n");
                break;
        }
    }

    else
    {
        printf("Characters are invalid, please enter a number: \n ");
        if (scanf("%d",&loopagain)==1)
            load_menu();
    }

}while((choice !=4));
}

キャラクターに入ると、なぜこれでも無限ループになるのですか? それはメニューです(ケースステートメントはまだ入力する必要があります)が、ifステートメントによる文字入力を処理していますが、まだ機能していないようです。ありがとう

4

4 に答える 4

4

文字入力が無効な場合、loopagain新しく呼び出さload_menu()れた は呼び出し元と同じにはなりません。まったく再帰しないでください:

else
{
    printf("Characters are invalid, please enter a number: \n ");
    choice = 0; // Unused, so continue the loop
}
于 2012-12-26T23:45:33.430 に答える
1

これまでに特定された問題は別として、問題の「文字」が入力バッファにスタックしていると思います。scanf で数値を読み取る場合、ホワイトスペードでも数字でもないものに当たるとすぐに停止します。したがって、バッファに「a\n」が含まれていて を呼び出すscanf("%d", ...)と、scanf はすぐに戻り、問題のある「a」がバッファから削除されるまでそれを続けます。

必要なのは、入力バッファから問題のある「ゴミ」を削除するための小さなループです。

以前に尋ねられた質問は次のとおりです (フラッシュの理由は少し異なりますが、解決策は同じです): バッファのフラッシュに関する質問

于 2012-12-26T23:55:47.377 に答える
0

数字ではない何かを入力した後scanf("%d",&choice)、入力バッファによって受け入れられず、フラッシュされません。fflush(stdin)許容できない入力を処理するときに を呼び出すことで、この問題を修正できるはずです。良いことに、scanf を呼び出すたびに入力バッファをフラッシュする方がよいでしょう。

私の考えでは、間違った入力の処理は意味がありません。それはあなたのケースのように扱われるべきだdefault:と思います。他の人が述べたように、再帰呼び出しは意味がありません。また、メニューの表示に戻ってユーザー入力を再度取得しようとしているときに、入力のために scanf を再度呼び出すこともありません。

于 2012-12-26T23:53:46.877 に答える
0

あなたの問題は loopagain 変数だと思います。その名の通り、この変数は、ループするかしないかのフラグのようなものであり、2 番目のループの進行方法を管理するものです。stdin(scanf) から読み取っているため、制御できなくなります。実装には既に 1 つの scanf があり、それはループであるため、再帰呼び出しは必要なく、適切な方法で loopagain 変数/フラグを使用して、常に同じ scanf を使用できます。さらに良いのは、この方法では、整数値が 4 である char がないことです (値 1 で scanf テストに合格することはありませんが、それでも...) EOT (ascii - cntr-D) のほかに、一般的なものであり、プログラムを壊す別の方法と考えることができます。

1つの解決策はこれです(私の解釈によると思います):

 #include <stdio.h>
    void load_menu(void);

    int main(void)
    {
        load_menu();
        return 0;
    }

    void load_menu(void)
    {
    int choice;
    int loopagain = 1;

    do
    {
        if(loopagain != 0){    /*You'll set it to different from 0 if the user entered a 'bad' number so the menu is only printed once*/
           printf("Menu \n\n");
           printf("Please enter your choice: \n");
           printf("1. \n");
           printf("2.\n");
           printf("3.\n");
           printf("4. Exit\n");
        }
        if (scanf("%d",&choice)==1)
        {

            switch(choice)
            {
                case 1:
                        break;
                case 2:
                        break;
                case 3:
                        break;
                case 4: printf("Quitting program!\n");
                        break;
                default:printf("Invalid choice! Please try again\n");
                        loopagain = 0;
                        printf("\n");
                    break;
            }
        }else{
            printf("Characters are invalid, please enter a number: \n ");
            loopagain = 0;
        }

    }while(choice !=4);
 }

それが役に立ったことを願っています。

于 2012-12-27T00:36:02.693 に答える