C:我如何在代码中打破这个循环?

时间:2015-09-24 21:39:27

标签: c loops break repeat

我之前看过有关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语句之后,因为我认为需要打破循环,但它不起作用。它与我的条件有关吗?我不确定我的条件是否正确,(关于==和||优先级等等),所以如果有人能澄清它也会很好。   我知道有可能更有效的方法来执行这个程序,但是我只限于我在课堂上学到的东西,这实际上并不比我编写的东西更多。

4 个答案:

答案 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(); 更好{}