如何通过键盘输入整型数给枚举变量赋值

        在程序设计中,有时会用到由若干个有限数据元素组成的集合,如一周内的星期一到星期日七个数据元素组成的集合,由三种颜色红、黄、绿组成的集合,一个工作班组内十个职工组成的集合等等,程序中某个变量取值仅限于集合中的元素。此时,可将这些数据集合定义为枚举类型。因此,枚举类型是某类数据可能取值的集合,如人的性别的集合{man,woman}。可如下定义:

         enum TSex{ man,woman};

         而且,枚举类型与整型常量值有一定的联系.。上面定义了一个名为TSex的枚举类型,它有2个元素值:man,woman。在编译器编译程序时,给枚举类型中的每一个元素指定一个整型常量值(也称为序号值)。若枚举类型定义中没有指定元素的整型常量值,则整型常量值从0开始依次递增。因此TSex的2个元素man,woman依次对应整型常量值0,1。但是,枚举类型有以下两个特点:

  1. 不能用键盘通过"cin>>"向枚举变量输入元素值,只能通过初始化或赋值运算符输入。例如:
    enum TSex {man,woman} sex1=man;//定义枚举变量时进行初始化
    TSex sex2; //定义了一个TSex类型的枚举变量sex2
    sex2=man;//通过赋值运算将元素值man赋给sex2
    TSex sex3;
    cin>>sex3;//这是错误的,无论输入元素值man,woman还是序号值0,1
  2. 可用"cout<<"输出枚举变量,但输出的是元素对应的序号值,而不是元素值。例如
    cout<<sex1<<endl;//输出的是sex1元素man对应的序号值0,而不是元素man。

        虽然不能通过键盘直接给枚举变量输入元素值,但是可以将输入的整型常量值强制转换后赋给枚举变量。例如,定义一个性别的枚举类型,通过键盘设定性别,并输出。

方法1:通过符号(int &)

        #include <iostream>
        using namespace std;
        int main()
        {  
        enum TSex {man,woman};//定义枚举类型TSex
        TSex sex; //定义枚举变量sex
         cout<<"输入0或1:0代表man,1代表woman"<<endl;
         cin>>(int &)sex; //通过整型引用给sex赋值
         switch(sex)  //通过switch循环输出性别
        {
         case man:cout<<"man"<<endl;break; //不能写成cout<<sex,因为它只会输出序号值0或1
         case woman:cout<<"woman"<<endl;break;
         default:cout<<"性别输入错误"<<endl;break;
        }
        return 0;
        }

方法2:通过枚举类型(enum TSex)

        #include <iostream>
        using namespace std;
        int main()
        {  
        enum TSex {man,woman};//定义枚举类型TSex
        TSex sex; //定义枚举变量sex
        int gender;//定义临时变量gender,用于保存输入的序号值

         cout<<"输入0或1:0代表man,1代表woman"<<endl;
        sex=(enum TSex)gender ; //强制转换
         switch(sex)  //通过switch循环输出性别
        {
         case man:cout<<"man"<<endl;break;
         case woman:cout<<"woman"<<endl;break;
         default:cout<<"性别输入错误"<<endl;break;
        }
        return 0;
        }

参考资料:

C语言枚举类型enum

枚举类型的定义



<think>我们使用枚举类型定义一组常量,然后声明枚举变量赋值,最后使用printf打印枚举变量的值。注意:枚举变量存储的是整数值,所以我们可以使用%d来打印其数值。如果希望打印枚举常量对应的名称(字符串),C语言没有直接支持,但我们可以通过自己编写映射函数来实现。根据引用[1]中的示例,枚举常量本质上是整数,默认从0开始递增。因此,我们可以将枚举变量视为整数,用%d格式打印。步骤:1.定义枚举类型2.声明枚举变量赋值3.使用printf打印枚举变量的整数值4.(可选)如果需要打印字符串形式的枚举常量名,可以写一个switch-case函数下面给出两个示例:示例1:打印枚举变量的整数值示例2:打印枚举变量对应的字符串名称注意:枚举变量赋值可以直接赋值枚举常量,也可以赋值为整数(但要注意类型安全,最好使用枚举常量)。</think>### C语言枚举变量赋值与打印详解 在C语言中,枚举变量本质上是整数常量,但通过命名提高了代码可读性。以下是枚举变量赋值和打印方法: #### 基本赋值与打印 ```c #include <stdio.h> // 定义枚举类型 enum Weekday { Monday, // 默认值0 Tuesday, // 1 Wednesday, // 2 Thursday, // 3 Friday, // 4 Saturday, // 5 Sunday // 6 }; int main() { // 声明并初始化枚举变量 enum Weekday today = Wednesday; // 直接赋枚举常量 // 打印枚举变量的整数值 printf("数值形式: %d\n", today); // 输出: 2 // 打印枚举常量本身的值 printf("Wednesday的值: %d\n", Wednesday); // 输出: 2 return 0; } ``` #### 显式赋值枚举常量 ```c enum StatusCode { OK = 200, NOT_FOUND = 404, SERVER_ERROR = 500 }; int main() { enum StatusCode response = NOT_FOUND; printf("HTTP状态码: %d\n", response); // 输出: 404 return 0; } ``` #### 打印枚举名称(需要自定义映射) ```c #include <stdio.h> enum Color { RED, GREEN, BLUE }; // 将枚举值转为字符串的函数 const char* colorToString(enum Color c) { switch(c) { case RED: return "红色"; case GREEN: return "绿色"; case BLUE: return "蓝色"; default: return "未知颜色"; } } int main() { enum Color myColor = GREEN; // 打印枚举值和名称 printf("颜色值: %d\n", myColor); // 输出: 1 printf("颜色名称: %s\n", colorToString(myColor)); // 输出: 绿色 return 0; } ``` #### 枚举变量赋值规则 1. **直接赋枚举常量**(推荐) ```c enum Weekday day = Friday; // 正确 ``` 2. **赋整数值**(编译器可能警告) ```c enum Weekday day = 4; // 等价于Friday,但不推荐 ``` 3. **枚举变量赋值** ```c enum Weekday day1 = Thursday; enum Weekday day2 = day1; // 正确 ``` #### 使用注意事项 1. **类型安全**:枚举变量只能存储定义范围内的值 2. **内存占用**:枚举变量大小等于`int`(通常4字节) 3. **作用域**:枚举常量具有文件作用域(可在函数外定义) 4. **打印限制**:`printf`无法直接输出枚举名,需自定义转换函数 #### 综合示例 ```c #include <stdio.h> // 定义带显式赋值枚举 enum LogLevel { DEBUG = 1, INFO = 2, WARNING = 3, ERROR = 4 }; // 枚举值转字符串函数 const char* levelToString(enum LogLevel level) { switch(level) { case DEBUG: return "DEBUG"; case INFO: return "INFO"; case WARNING: return "WARNING"; case ERROR: return "ERROR"; default: return "UNKNOWN"; } } int main() { // 声明并赋值 enum LogLevel currentLevel = WARNING; // 打印数值和名称 printf("日志级别值: %d\n", currentLevel); printf("日志级别名: %s\n", levelToString(currentLevel)); // 重新赋值 currentLevel = DEBUG; printf("新级别: %s (%d)\n", levelToString(currentLevel), currentLevel); return 0; } ``` 输出: ``` 日志级别值: 3 日志级别名: WARNING 新级别: DEBUG (1) ``` > **关键点**:枚举变量本质是整数常量,用`%d`格式打印其数值。如需打印名称,需自定义转换函数[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值