我对PrintGenre函数中的case语句有点困惑;它正确传递值,但默认为Undefined。
一点点背景;这最终成为一个(非常简单的)文本音乐播放器,我想我已经找到了一种更简单的方法来做到这一点,但仅仅为了我的整体理解,我想弄清楚为什么这个案例陈述不起作用我希望它的方式。
如果我删除默认选项,它将转到列表中的最后一个案例选项。
我对C语言比较陌生,所以如果我有任何误解,请告诉我。
#include "terminal_user_input.h"
#include <stdio.h>
#include <string.h>
enum musicGenre {Pop, Alternative_Rock, Electronic, Undefined};
struct Album
{
my_string Title;
my_string Artist;
int Year;
enum musicGenre Genre;
};
my_string PrintGenre(int Genre)
{
//Variables
my_string result;
printf("%d", Genre); //outputs correctly
switch (Genre)
{
case 0:
strcpy(result.str, "Pop");
case 1:
strcpy(result.str, "Alternative Rock");
case 2:
strcpy(result.str, "Electronic");
default:
strcpy(result.str, "Undefined");
}
return result;
}
int main()
{
// Variables
struct Album Album1;
int choice;
printf("1. Pop\n");
printf("2. Alternative Rock\n");
printf("3. Electronic\n");
choice = read_integer("Please select a genre: ");
switch (choice)
{
case 1:
Album1.Genre = 0;
break;
case 2:
Album1.Genre = 1;
break;
case 3:
Album1.Genre = 2;
break;
default:
Album1.Genre = 3;
break;
}
printf("%d", Album1.Genre);
printf("The genre of Album 1 is %s", PrintGenre(Album1.Genre).str);
return 0;
}
答案 0 :(得分:2)
在您的代码中,
switch (Genre)
{
case 0:
strcpy(result.str, "Pop");
case 1:
strcpy(result.str, "Alternative Rock");
case 2:
strcpy(result.str, "Electronic");
default:
strcpy(result.str, "Undefined");
}
所有案例陈述机构都缺少break;
语句,这使其成为 fall-through switch 。
为了避免这种“不受欢迎”的行为,每次要限制程序流到身体的某个部位时,都需要添加break;
语句。
引用C11
标准中的示例,章节§6.8.4.2/ P7
示例在人工程序片段中
switch (expr) { int i = 4; f(i); case 0: i = 17; /* falls through into default code */ << --- NOTE HERE default: printf("%d\n", i); }
答案 1 :(得分:1)
添加break
;
switch (Genre)
{
case 0:
strcpy(result.str, "Pop"); break;
case 1:
strcpy(result.str, "Alternative Rock"); break;
case 2:
strcpy(result.str, "Electronic"); break;
default:
strcpy(result.str, "Undefined");
}