C 如何确定输出时使用的联合类型?

C 如何确定输出时使用的联合类型?,c,struct,unions,C,Struct,Unions,我在结构中使用了联合类型来定义此人是学生还是职员。当我试图在struct数组中输出信息时,我发现很难弄清楚这个人是什么样的人,更不用说输出进一步的信息了。不要告诉我停止使用union,对不起,我是被要求这样做的。 这是我的简化数据结构: typedef union student_or_staff{ char *program_name; char *room_num; }student_or_staff; typedef struct people{ char *na

我在结构中使用了联合类型来定义此人是学生还是职员。当我试图在struct数组中输出信息时,我发现很难弄清楚这个人是什么样的人,更不用说输出进一步的信息了。不要告诉我停止使用union,对不起,我是被要求这样做的。 这是我的简化数据结构:

typedef union student_or_staff{
    char *program_name;
    char *room_num;
}student_or_staff;

typedef struct people{
    char *names;
    int age;
    student_or_staff s_or_s;
}people[7];

在C中不可能做到这一点,但作为一种解决方法,您可以像这样在联合体中添加一个类型

enum { student_type, staff_type } PEOPLE_TYPE;
typedef union student_or_staff{
char *program_name;
char *room_num;
}student_or_staff;

typedef struct people{
char *names;
int age;
student_or_staff s_or_s;
PEOPLE_TYPE people_type;
}people[7];

然后,在分配结构时,只需将其与并集一起设置。

在C中不可能这样做,但作为一种解决方法,您可以沿并集添加一个类型,如下所示

enum { student_type, staff_type } PEOPLE_TYPE;
typedef union student_or_staff{
char *program_name;
char *room_num;
}student_or_staff;

typedef struct people{
char *names;
int age;
student_or_staff s_or_s;
PEOPLE_TYPE people_type;
}people[7];

然后在分配结构时将其与联合一起设置。

了解联合中存储的内容的唯一方法是在其他位置包含此信息

处理
联合
数组(或包含
联合
结构
数组)时,有两种常见情况:

  • 数组中的所有
    union
    s都具有相同的类型,或
  • 每个
    union
    可以保存自己的类型
当一个数组中的所有
union
s都持有相同的类型时,一个表示该
union
s持有的类型的变量就足够了

当每个
联合
可以包含不同的类型时,常用的方法是将其包装在
结构
中,并添加一个标志,指示联合的设置方式。使用您的示例,应该将该标志添加到
struct people
,如下所示:

enum student_staff_flag {
    student_flag
,   staff_flag
};
typedef struct people{
    char *names;
    int age;
    enum student_staff_flag s_or_s_flag;
    student_or_staff s_or_s;
}people[7];

了解
联合体中存储的内容的唯一方法是在其他位置包含此信息

处理
联合
数组(或包含
联合
结构
数组)时,有两种常见情况:

  • 数组中的所有
    union
    s都具有相同的类型,或
  • 每个
    union
    可以保存自己的类型
当一个数组中的所有
union
s都持有相同的类型时,一个表示该
union
s持有的类型的变量就足够了

当每个
联合
可以包含不同的类型时,常用的方法是将其包装在
结构
中,并添加一个标志,指示联合
的设置方式。使用您的示例,应该将该标志添加到
struct people
,如下所示:

enum student_staff_flag {
    student_flag
,   staff_flag
};
typedef struct people{
    char *names;
    int age;
    enum student_staff_flag s_or_s_flag;
    student_or_staff s_or_s;
}people[7];

这不难,这是不可能的。在
学生或教职员工中添加一个标志,表明什么是什么。你不能在开箱即用的情况下做这种事情。如果你被告知这样做,并且这是一个练习,我很想知道确切的说明是什么。你怎么能说出它是什么?我看不出有什么区别。谢谢!我将在结构中添加另一个参数来标记它是什么类型的联合。这不是“难”,这是不可能的。在
学生或教职员工中添加一个标志,表明什么是什么。你不能在开箱即用的情况下做这种事情。如果你被告知这样做,并且这是一个练习,我很想知道确切的说明是什么。你怎么能说出它是什么?我看不出有什么区别。谢谢!我将在结构中添加另一个参数,以标记它是哪种类型的联合。-----------------------------------------谢谢---------------------------------------------谢谢---------------------------------------------谢谢---------------------------------------------谢谢---------------------------------------------谢谢---------------------------------