首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给我一个无限循环的代码

给我一个无限循环的代码
EN

Stack Overflow用户
提问于 2012-12-27 07:42:40
回答 4查看 493关注 0票数 1
代码语言:javascript
复制
#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语句输入的字符,但它似乎仍然不起作用。谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-27 07:45:33

如果字符输入无效,则新调用的load_menu()中的loopagain将与其调用者中的不同。根本不要递归:

代码语言:javascript
复制
else
{
    printf("Characters are invalid, please enter a number: \n ");
    choice = 0; // Unused, so continue the loop
}
票数 4
EN

Stack Overflow用户

发布于 2012-12-27 07:55:47

我认为,除了到目前为止发现的问题之外,有问题的“字母”被困在输入缓冲区中。当使用scanf读取数字时,只要命中任何不是白板和数字的数字,它就会停止。因此,如果缓冲区包含"a\n",并且我们调用了scanf("%d", ...),那么scanf将立即返回,并且会一直这样做,直到令人不快的'a‘从缓冲区中删除。

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

下面是前面提出问题(尽管刷新的原因略有不同,但解决方案是相同的):Question about flushing buffer

票数 1
EN

Stack Overflow用户

发布于 2012-12-27 07:53:47

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14047654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档