我之前看过有关stackoverflow的问题,但这是我第一次询问,所以我提前为任何格式错误道歉。我已经上了一个关于C编程的课程大约一个月了,我已经被赋予了一个在我的main函数中使用do / while循环来循环displayMenu()的赋值,它允许用户输入1, 2,或3显示一定的信息块。
int main(void)
{
int option = 0;
do
{
option = displayMenu();
}
while (option == displayName() || displayColor() || displayFood());
}
//Display the menu for choosing an option or exiting the program
int displayMenu()
{
int choice = 1;
while (choice == 1 || 2 || 3)
{
puts("Choose which piece of information you would like to know:");
printf("%s", "1 - My name, 2 - My favorite color, 3 - My favorite food\n");
printf("%s", "Or type in any other number to exit the program: ");
scanf("%d", &choice);
puts("");
if (choice == 1)
displayName();
if (choice == 2)
displayColor();
if (choice == 3)
displayFood();
}
return choice;
}
现在,我确定错误在这两种方法中的某处,但为了以防万一,我正在发布显示方法。
//Function to display my name
int displayName()
{
int value = 1;
puts("My name is x.\n");
return value;
}
//Function to display my favorite color
int displayColor()
{
int value = 2;
puts("My favorite color is y.\n");
return value;
}
//Function to display my favorite food
int displayFood()
{
int value = 3;
puts("My favorite food is z.\n");
return value;
}
如果用户输入1,2或3,程序将正确显示信息和循环,以再次提示用户输入其他值。但是,如果输入任何其他数字,程序会再次提示用户输入一个值,而应该关闭程序。 我究竟做错了什么?我试过插入一个
else return choice;
在前三个if语句之后,因为我认为需要打破循环,但它不起作用。它与我的条件有关吗?我不确定我的条件是否正确,(关于==和||优先级等等),所以如果有人能澄清它也会很好。 我知道有可能更有效的方法来执行这个程序,但是我只限于我在课堂上学到的东西,这实际上并不比我编写的东西更多。
答案 0 :(得分:5)
while (choice == 1 || 2 || 3)
相当于
while ((choice == 1) || 2 || 3)
相当于
while (1)
你想要的是:
while (choice == 1 || choice == 2 || choice == 3)
答案 1 :(得分:2)
这一行是一个infite循环:
while (choice == 1 || 2 || 3)
我想你想要的是:
while (choice == 1 || choice == 2 || choice == 3)
答案 2 :(得分:1)
忽略原始代码中的许多错误,重构循环逻辑的方法是使用函数指针数组:
int (*functions[])(void) = { displayName, displayColor, displayFood };
int choice = -1;
do {
choice = get_choice(); // assuming get_choice returns an integer between 0 and 2, or -1 on error/eof.
if (choice != -1)
functions[choice]();
} while (choice != -1)
如果所有函数都具有相同的原型,这将使您的代码更简洁。
答案 3 :(得分:0)
好吧,因为你得到了答案,我不会试图给你另一个答案,这可能是相同的。
您应该知道,如果用户输入字母或数字+字母( 1j )会发生什么?
在处理文本菜单时,您应该可以控制程序。
以下是您的计划的更好方法:
#include <stdio.h>
#include <string.h>
int checkInput(int min, int max){
int option,check;
char c;
do{
printf("Choose an Option:\t");
if(scanf("%d%c",&option,&c) == 0 || c != '\n'){
while((check = getchar()) != 0 && check != '\n');
printf("\tThe option has to be between %d and %d\n\n",min,max);
}else if(option < min || option > max){
printf("\tThe option has to be between %d and %d\n\n",min,max);
}else{
break;
}
}while(1);
return option;
}
void quit(void){
printf("Goodbye...\n");
}
//Function to display my name
int displayName(void){
int value = 1;
puts("My name is x.\n");
return value;
}
//Function to display my favorite color
int displayColor(void){
int value = 2;
puts("My favorite color is y.\n");
return value;
}
//Function to display my favorite food
int displayFood(void){
int value = 3;
puts("My favorite food is z.\n");
return value;
}
int displayMenu(void);
int main(void){
int option = 0;
do{
option = displayMenu();
}
while (option != 0);
}
//Display the menu for choosing an option or exiting the program
int displayMenu(void){
int choice;
do{
puts("Choose which piece of information you would like to know:");
printf("%s", "1 - My name\n2 - My favorite color\n3 - My favorite food\n\n");
printf("%s", "Or type in any other number to exit the program: ");
choice = checkInput(0,3);
puts("");
if (choice == 1){
displayName();
}else if (choice == 2){
displayColor();
}else if (choice == 3){
displayFood();
}else if( choice == 0){
quit();
}
}while (choice != 0);
return choice;
}
可能是 do {} while(); 比更好{} 。