見学に行くとしたら【天国】と【地獄】どっち?

enumで宣言されたメンバ名を取得する方法を教えてください


```c
#include <stdio.h>

enum name{
Tom = 50,
Sharon = 32,
Bill = 40,
Teresa = 10,
John = 1
};

int main(void) {
int num = 0;
int num2 = 0;
scanf("%d%d",&num,&num2);

if(num < num2){
int from = num2;
num2 = num;
num = from;
}

enum name Tom,Sharon,Bill,Teresa,John;

printf("%s", );❗️❗️❗️


return 0;
}
```

このような感じで数字を入力してその数字に応じた名前を取得してプリントしたいです

A 回答 (5件)

ちょうどプリプロセッサの文字列化に関する質問


https://oshiete.goo.ne.jp/qa/12848642.html
があったので, それを使う方法を書いてみる (ただし規格に適合するように書こうとすると現時点ではまだきれいには書けない).

まず decl-enums.txt というファイル (まあ名前はどうでもいいんだが) に
DeclareEnumerator(Tom, = 50)
DeclareEnumerator(Sharon, = 32)
DeclareEnumerator(Bill, = 40)
DeclareEnumerator(Teresa, = 10)
DeclareEnumerator(John, = 1)
と書いておいて
列挙型の宣言を
enum name {
#define DeclareEnumerator(enumerator, ...) enumerator __VA_ARGS__,
#include "decl-enums.txt"
#undef DeclareEnumerator
};
とする. んで列挙子からその名称を得る関数を
const char *getEnumeratorName(int val)
{
switch (val) {
#define DeclareEnumerator(enumerator, ...) case enumerator: return #enumerator;
#include "decl-enums.txt"
#undef DeclareEnumerator
default: return "no such enumerator"; // てきとう
}
}
とか書く. 列挙子を変えたり増減させたりしたいときには decl-enums.txt を適宜いじるようにすれば, メインのプログラム自体はさわらなくていいので安心.

__VA_OPT__ が使えればもっときれいなのだが現状 C の規格にはないのでここまで.
    • good
    • 1

ついでに.



main の中で
enum name Tom,Sharon,Bill,Teresa,John;
って定義してるけど, そこからあとでは列挙型 name の列挙子が使えなくなることは認識できてるのかな?
    • good
    • 0

C にリフレクションはないので, #2 のように「自力でなんとかする」しかないね.



switch 使って列挙子使って, ってやるのが普通だろうけど.
    • good
    • 0

enumで宣言されたメンバ名を取得する関数を作成して、その関数を呼び出せばよいのでは?



char *getEnumName(int x){
if(x==50) return("Tom");
else if (x==32) return("Sharon");
:
見たいな感じでしょうか
    • good
    • 0

これは、2次元配列を使うべきだと思います。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報