You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:48:01