这是一个很长的帖子,所以请耐心等待。我想要做的就是在循环开始时获取一些用户输入,根据输入做一些事情并可能重复。够简单吧?这就是我所拥有的。
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程序员可能会伸出援助之手:)
答案 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)。