如何使用cout输出enum枚举类型的元素名称
枚举类型输入输出异常问题修复
问题根因
- C++原生枚举本质是整数类型的语法糖,默认底层为int类型,直接用cout输出时默认打印对应的整数值,不会自动转换为枚举的字面量字符串。
- 现有重载的输入运算符逻辑错误:当前逻辑优先读取整数再强转为枚举,输入字符串
push_ups时整数读取失败,流进入错误状态,枚举变量未被正确初始化,输出的是内存中的随机垃圾值,也就是你看到的无意义大数。
修复代码
#include <iostream> #include <string> using namespace std; enum exercise { push_ups, sit_ups, squats, walking, radio_calisthenics }; // 重载输入运算符,支持字符串匹配枚举 istream& operator>>(istream& is, exercise& i) { string tmp; if (is >> tmp) { if (tmp == "push_ups") i = push_ups; else if (tmp == "sit_ups") i = sit_ups; else if (tmp == "squats") i = squats; else if (tmp == "walking") i = walking; else if (tmp == "radio_calisthenics") i = radio_calisthenics; else { // 输入不匹配时设置流错误状态 is.setstate(ios::failbit); } } return is; } // 重载输出运算符,枚举转对应字符串输出 ostream& operator<<(ostream& os, const exercise& i) { switch(i) { case push_ups: os << "push_ups"; break; case sit_ups: os << "sit_ups"; break; case squats: os << "squats"; break; case walking: os << "walking"; break; case radio_calisthenics: os << "radio_calisthenics"; break; default: os.setstate(ios::failbit); } return os; } int main() { exercise a; cin >> a; if (cin) { // 校验输入合法性 cout << a << endl; } else { cout << "输入的运动类型不合法" << endl; } return 0; }
逻辑说明
- 重新实现的输入运算符改为读取字符串,匹配枚举对应的字面量后赋值,匹配失败主动设置流错误状态
- 新增输出运算符重载,根据枚举值输出对应字面量字符串
- 主函数增加输入合法性判断,避免非法输入导致异常输出
- 后续如果新增枚举值,同步更新输入、输出运算符的匹配逻辑即可
内容的提问来源于stack exchange,提问作者Yuya
相关产品推荐
相关产品推荐

