代码给了我一个无限循环

时间:2012-12-26 23:42:40

标签: c

#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 个答案:

答案 0 :(得分:4)

如果字符输入无效,则新调用的loopagain中的load_menu()将与其调用者中的else { printf("Characters are invalid, please enter a number: \n "); choice = 0; // Unused, so continue the loop } 不同。根本不要递归:

{{1}}

答案 1 :(得分:1)

我相信,除了目前发现的问题之外,有问题的“字母”卡在输入缓冲区中。使用scanf读取数字时,只要它击中任何不是白色的数字而不是数字,它就会停止。因此,如果缓冲区包含“a \ n”,并且我们调用scanf("%d", ...),则scanf将返回immediatelty,并将继续这样做,直到从缓冲区中移除了“a”。

我们需要的是一个小循环来从输入缓冲区中删除有问题的“垃圾”。

这是之前提出的问题(尽管冲洗的原因略有不同,解决方案是相同的): Question about flushing buffer

答案 2 :(得分:0)

输入的内容不是数字,因此scanf("%d",&choice)不接受输入缓冲区未刷新。我相信在处理不可接受的输入时,您应该能够通过调用fflush(stdin)来解决此问题。更好的是,每次调用scanf后,你可能会更好地刷新输入缓冲区。

在我看来,你对错误输入的处理没有意义。我认为它应该更像你的default:案件。正如其他人所说的那样,递归调用没有意义,当你要回到显示菜单并再次获得用户输入时,也不会再次调用scanf。

答案 3 :(得分:0)

我认为你的问题是loopagain变量。通过名称,你正在考虑这个变量,就像一个标志循环或不再循环,并管理你的第二个循环的方式。由于你是从stdin(scanf)读取它,你将失去对它的控制。 由于你的实现中已经有一个scanf,因为它是一个循环,你不需要递归调用,你可以使用loopagain变量/ flag以正确的方式使用相同的scanf。 更好的是,通过这种方式,除了EOT(ascii - cntr-D)之外,没有其整数值为4的字符(它永远不会通过值为1的scanf测试,但仍然......)常见的,您可以将其视为打破计划的另一种方式。

这是一个解决方案(我想,根据我的解释):

 #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);
 }

希望它有所帮助。