• ベストアンサー

C言語におけるenum型

enum word{apple banana orange}; enum word w; と定義します。 scanfなどでキーボード入力から"apple"などを入力したとします。 この入力文字を変数wに格納(列挙型 で定義されている整数値を格納)するには どのようにしたらいいですか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#144013
noname#144013
回答No.3

こんにちは。 enum値の【数値⇔名前文字列】相互変換を強引にマクロ化してみました。 宜しければ試してみて下さい。 ◎参考過去ログ(↓こちらが参考になりました。) 変数名を文字に変換して取り出すには? http://okwave.jp/qa299912.html なお、ご使用の環境で上手くいかなかった場合はすみません。 参考になれば幸いです。 ■サンプルソース 注)インデントのため全角スペースを入れています。 /* * enum1.c:ENUM値の【数値⇔文字列】変換テスト */ #include <stdio.h> #include <string.h> /*== ENUM定義 ==*/ enum EN_WORD {   apple,  /* =0 */   banana,  /* =1 */   orange,  /* =2 */   other  /* =3 */ }; /*== MACRO ==*/ /* enum値→enum識別名(文字列) 変換 */ #define GET_ESTR(en) #en /* enum識別名(文字列)→enum値 変換 */ #define GET_ENUM(es) !strcmp(GET_ESTR(apple), es)? apple:\           !strcmp(GET_ESTR(banana), es)? banana:\           !strcmp(GET_ESTR(orange), es)? orange:other int main() {   enum EN_WORD wd;   char s1[] = { "apple" };   char s2[] = { "banana" };   char s3[] = { "orange" };   char s4[] = { "hogehoge" };   /* enum値からenum識別名(文字列)への変換 */   printf( "== MACRO TEST : GET_ESTR(enum value) ==\n" );   printf( "GET_ESTR(apple) =%s\n", GET_ESTR(apple) );   printf( "GET_ESTR(banana)=%s\n", GET_ESTR(banana) );   printf( "GET_ESTR(orange)=%s\n", GET_ESTR(orange) );   printf( "GET_ESTR(other) =%s\n", GET_ESTR(other) );   /* enum値の識別名(文字列)からenum値への変換 */   printf( "\n== MACRO TEST : GET_ENUM(enum string) ==\n" );   wd = GET_ENUM(s1);   printf( "s1=%s\n", s1 );   printf( "wd=%d\n", wd );   wd = GET_ENUM(s2);   printf( "s2=%s\n", s2 );   printf( "wd=%d\n", wd );   wd = GET_ENUM(s3);   printf( "s3=%s\n", s3 );   printf( "wd=%d\n", wd );   wd = GET_ENUM(s4);   printf( "s4=%s\n", s4 );   printf( "wd=%d\n", wd );   return 0; } <実行結果> == MACRO TEST : GET_ESTR(enum value) == GET_ESTR(apple) =apple GET_ESTR(banana)=banana GET_ESTR(orange)=orange GET_ESTR(other) =other == MACRO TEST : GET_ENUM(enum string) == s1=apple wd=0 s2=banana wd=1 s3=orange wd=2 s4=hogehoge wd=3 以上です。

その他の回答 (2)

回答No.2

enum word{apple banana orange}; は #define apple 0 #define banana 1 #define orange 2 と書くようなものです。 このプログラム上には「appleと言う文字列」は、どこにも存在しません。0と1と2が「別の名前で定義されただけ」です。 それなのに「文字列として入力されたキーボードからの入力」を、何と比較しろと言うのでしょう。 根本から間違っています。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

enumは整数なので文字列との比較は無理です。 char* str[] = {"apple", "banana", "orange"}; のような文字列の配列が必要でしょう。 入力された文字列と配列の文字列を比較して一致した配列のインデックスを格納すればいいでしょう。

関連するQ&A

専門家に質問してみよう