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

为什么当我输入一个字符时这仍然给我一个无限循环?这是一个菜单(case 语句仍然需要填写),但我正在处理 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 后,您可能会更好地 servde 刷新输入缓冲区。

在我看来,您对错误输入的处理没有意义。我认为它应该更像你的default:情况来处理。正如其他人所说,递归调用没有意义,当您要返回显示菜单并再次获取用户输入时,再次调用 scanf 进行输入也没有意义。

于 2012-12-26T23:53:46.877 回答
0

我认为你的问题是 loopagain 变量。顾名思义,您正在考虑将此变量视为是否再次循环的标志,并管理您的第二个循环的方式。由于您是从 stdin(scanf) 读取它,因此您将失去对它的控制。由于您的实现中已经有一个 scanf 并且它是一个循环,因此您不需要递归调用,并且您可以始终使用相同的 scanf,以正确的方式使用 loopagain 变量/标志。更好的是,通过这种方式,除了 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);
 }

希望它有所帮助。

于 2012-12-27T00:36:02.693 回答