C、循环退出条件

标签 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 程序员可能会伸出援手 :)

最佳答案

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

如果您不想在您已经在代码中声明多个 scanf 并弹出特定错误时一直这样做,您可以在预处理器定义中添加 _CRT_NO_SECURE_WARNINGS 句子.不过,我不知道使用的确切含义 scanf_s over scanf 和相反,以及它如何影响程序的输入。

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

我想以上所有内容仅适用于您的 IDE 是 Visual Studio 的情况,这就是您的情况。

至于 case 0 中的 return 语句。这将强制循环终止,从而退出函数。您可以使用 break 语句来结束 switch 语句中特定情况的处理,并改为分支到 switch 的末尾,这样循环就可以继续并再次显示您的菜单。

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

关于C、循环退出条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20182944/

相关文章:

c - C中通过winsockets接收数据

c - 使用最大有符号 int 值时,项目 euler 的函数出错

c++ - 如何多次发送SIGINT信号

java - BlueJ中的for循环输入(无限循环)

c - 段错误 11,寻找标志作为输入 - C

c - 输入字母导致程序崩溃,只需要输入数字

C警告函数调用中缺少哨兵

无法让这个与字符串相关的C语言程序运行

c - 使用 fscanf() 读取 unsigned long long

c - 每次迭代都会替换索引中的值