C - Case语句无法比较变量

时间:2017-05-19 10:48:47

标签: c switch-statement

我对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;
}

2 个答案:

答案 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");
    }