zoukankan      html  css  js  c++  java
  • C语言中以字符串形式输出枚举变量

    C语言中以字符串形式输出枚举变量

    摘自:https://blog.csdn.net/haifeilang/article/details/41079255

       每个枚举常量对应一个整形数字,很多时候可以像整形一样使用,这个大家都知道;但是如果要求打印枚举变量名的字符串,办法也有很多,查看网上方法几乎都需要转换,要么用数组,下面要说的是一种可以算是直接打印的新方法;

     #会将后面的内容作为字符串返回

    如果想让#后面的内容作为宏使用,需要使用两层宏展开,且使用宏使用的宏里面的每个字符见到的字符都会作为返回字符串的一部分。如

    printf("10->%s
    ", MY_DEFINE2(MY_STRING2));

    即:

    #define MY_DEFINE(R) #R
    #define MY_DEFINE2(R) MY_DEFINE(R)
     1 #include <stdio.h>
     2 
     3 #define MY_INT 7777
     4 #define MY_STRING "9999"
     5 #define MY_STRING2 "9999"8OK"000(888)
     6 #define ENUM_CHIP_TYPE_CASE(x)   case x: return(#x);
     7 #define MY_DEFINE(R) #R
     8 #define MY_DEFINE2(R) MY_DEFINE(R)
     9 
    10 enum cvmx_chip_types_enum {
    11     CVMX_CHIP_TYPE_NULL = 0,
    12     CVMX_CHIP_TYPE_DEPRECATED = 1,
    13     CVMX_CHIP_TYPE_OCTEON_SAMPLE = 2,
    14     CVMX_CHIP_TYPE_MAX
    15 };
    16 
    17 
    18 static inline const char *cvmx_chip_type_to_string(enum cvmx_chip_types_enum type)
    19 {
    20     switch (type)
    21     {
    22         ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_NULL)
    23             ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_DEPRECATED)
    24             ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_OCTEON_SAMPLE)
    25             ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_MAX)
    26     }
    27     return "Unsupported Chip";
    28 
    29 }
    30 
    31 int main()
    32 {
    33     enum cvmx_chip_types_enum a;
    34     int my_int_test = 7;
    35 
    36     printf("1->%s
    ", MY_DEFINE(CVMX_CHIP_TYPE_DEPRECATED));
    37     printf("2->%s
    ", MY_DEFINE(my_int_test));
    38     printf("3->%s
    ", MY_DEFINE(8888));
    39     printf("4->%s
    ", MY_DEFINE(MY_INT));
    40     printf("5->%s
    ", MY_DEFINE2(MY_INT));
    41     printf("6->%s
    ", "MY_INT");
    42     printf("7->%s
    ", MY_DEFINE(MY_STRING));
    43     printf("8->%s
    ", MY_DEFINE2(MY_STRING));
    44     printf("9->%s
    ", MY_DEFINE(MY_STRING2));
    45     printf("10->%s
    ", MY_DEFINE2(MY_STRING2));
    46 
    47     while(1)
    48     {
    49         printf("input(0~3):");
    50         scanf("%d",&a);
    51         if(a<CVMX_CHIP_TYPE_NULL||a>CVMX_CHIP_TYPE_MAX)
    52         {
    53             printf("error,you must input number between 0 and 3,please try again!
    
    ");
    54             continue;
    55         }
    56         printf("
    ");
    57 
    58         printf("the result:%s 
    
    ",cvmx_chip_type_to_string(a));
    59     }
    60 
    61     return 0;
    62 }

    结果测试:

    如何不想全部打印出名字,只想打印出后面几个字符,例如“CVMX_CHIP_TYPE_DEPRECATED”,

    我只想要打印后面“DEPRECATED”字符串,上面代码只需修改宏:

    #define ENUM_CHIP_TYPE_CASE(x)   case x: return(#x); 改为下面所示

    #define ENUM_CHIP_TYPE_CASE(x)   case x: return(#x+15);  //从第16个字符串开始打印,不要前面15个

    结果如下:

      

    挺实用的技巧吧!

     

  • 相关阅读:
    循环
    rugarch包与R语言中的garch族模型
    Logistic回归
    机器学习缺失值处理方法汇总
    pandas库介绍之DataFrame基本操作
    python中常用的九种预处理方法
    谁动了我的特征?——sklearn特征转换行为全记录
    使用sklearn优雅地进行数据挖掘
    使用sklearn做单机特征工程
    彻底解决matplotlib中文乱码问题
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/10659483.html
Copyright © 2011-2022 走看看