C,循环退出条件

时间:2013-11-25 00:25:50

标签: c scanf infinite-loop

这是一个很长的帖子,所以请耐心等待。我想要做的就是在循环开始时获取一些用户输入,根据输入做一些事情并可能重复。够简单吧?这就是我所拥有的。

void displayMain(Album albums[], int num_albums){

    int break_condition = 1;
    int user_choice; 

    //keep looping until we decide to quit
    while (break_condition){

            user_choice = displayMenu();

            switch(user_choice){

                    case 0 :
                            return; //does this need to be return 0 or can it just be return (or is it the same thing?)  
                    case 1 :
                            displayAlbums(albums, num_albums);
                            break;
                    case 2 :
                            printf("display tracks\n");
                            break;

                    default : 
                            printf("Invalid choice!\n\n");
                            break;

            }

    }

    return;

} 

函数displayMenu()基本上抓取一些用户输入并返回一个int。

int displayMenu(void){

    printf("Display Menu\n1. Display all albums\n2. Display the tracks in an album\n0. Return to the mainmenu\nPlease enter the choice:\n");

    //grab and return the choice
    int choice;
    scanf("%d", &choice);
    return choice;

}

所以当我最终运行所有这些代码时,如果我输入一个“坏”选项,即:一个采用switch语句中的默认路径,则代码进入无限循环。重复内容

Display Menu
1. Display all albums
2. Display the tracks in an album
0. Return to the main menu
Please enter the choice:
Invalid choice!

我几乎是C的新手,所以我相信我知道为什么会这样。 user_choice永远不会被重置,即使显然正在调用函数displayMenu(因为无限循环输出)

为什么在输入一个“坏”输入实例后,displayMenu不再要求用户输入?是因为它不是整数吗?当我尝试调试并打印出user_choice时,它是一个很大的数字,很可能是一个寄存器或类似的东西。

请帮助,正如我所说,我吮吸C,所以一位经验丰富的C程序员可能会伸出援助之手:)

1 个答案:

答案 0 :(得分:0)

Visual Studio 2012 中运行代码(在 Cygwin终端中执行它作为 .c 扩展,我也测试了它,它的工作原理很好)我得到的唯一错误是我应该使用scanf(scanf_s)的安全版本。

如果您不想在代码中声明多个scanf并且弹出特定错误的整个时间内执行此操作,则可以在预处理器定义中添加 _CRT_NO_SECURE_WARNINGS 句子。不过,我不知道使用的确切含义 scanf_s over scanf和相反的以及它如何影响程序的输入。

[右键单击项目 - >的属性 - > C / C ++ - > 预处理程序定义并添加句子。 ]

以上所有我想只适用于您的IDE是Visual Studio而且适合您的情况。

对于案例0中的 return 语句。这将强制循环终止,因此它将退出该函数。您可以使用 break 语句结束switch语句中特定情况的处理,并转而分支到开关的末尾,这样循环就可以继续并再次显示菜单。

返回0值类型将与您的函数类型不匹配(只要您将其声明为void)。