• ベストアンサー

C言語におけるenum型

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

  • pferd
  • お礼率22% (11/48)

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

  • ベストアンサー
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)

  • chie65535
  • ベストアンサー率43% (8525/19381)
回答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

  • C語でenumの使い方

    http://www9.plala.or.jp/sgwr-t/c/sec16.html の下部に enum week { SUN, MON, TUE, WED, THU, FRI, SAT }; int main(void) { enum week w;   /* ⇒列挙型 week で変数 w を宣言 */ w = MON; /* ⇒変数 w に列挙定数 MON を代入 */ と書かれています。 列挙型 week で変数 w を宣言するのはどういうときに メリットがありますか? 普通にunsigned char w と何が違うのでしょうか?

  • 列挙型switch文での利用が、実行できません

    或る書籍で、Javaを独習しているビギナーです。 何方か、ご教授をお願い致します。 「列挙型switch文での利用」との項目で、下記ソースプログラムをそれぞれ入力しましたが、コンパイルが、通りません、何処がおかしいのでしょうか? [Fruts10.java] enum Fruts10 { APPLE, ORANGE, BANANA } [Enum.java] class Enum { public static void main(String[] args) { for( Fruts fruts : Fruts10.values()) { switch( fruts ) { case APPLE : System.out.println("りんご :" + fruts); break; case ORANGE : System.out.println("みかん :" + fruts); break; case BANANA : System.out.println("バナナ :" + fruts); break; } } } } [Fruts.java]の方は、コンパイル通りましたが、[Enum.java]の方が、コンパイルすると、「シンボルを見つけられません、クラスFruts、変数APPLE、変数ORANGE、変数BANANA」と、エラーメッセージが、表示されてしまいます。何処がおかしいのでしょうか?

  • javaによるenum型の扱い

    最近javaに親しんできたのですが、 Cとjavaにおける列挙型の扱いの違いに困っています。 javaにおけるenumはクラスであり、 各要素にメソッドを追加できることは分かったのですが…… 例えば、Cにおけるenumは確か、 typedef enum{EAST,SOUTH,WEST,NORTH} dirT; //定義 -------- (略) -------- dirT dir=EAST; //宣言・dirに要素EASTを格納 というようなことが出来たと思いますが、 javaはenumもクラスで、さらにnewでメモリ確保できないと聞きました。 つまり、このように列挙型の保持はできないということになるのでしょうか。 結局やりたいこととしては、このように「保持してある」列挙型に対して 条件分岐処理をしたいと考えています。 説明が上手くできず伝わりにくいかと思いますが、 どうか回答をお願いいたします。

    • ベストアンサー
    • Java
  • enumの値から定義名を文字列化したい

    C++でenumの値を元に、定義した名前(Fruits_Appleとか)を文字列として取得したいのですが、何か良い方法はないでしょうか? switch文等で分岐させて...という方法もありますが、enumの定義数が多くなるとコードが複雑になるので、シンプルな方法をさがしています。 enum Fruits{ Fruits_Apple, Fruits_Orange, Fruits_End }; void printFruits(Fruits fruits) { // ここで引数fruitsの値に応じて"Fruits_Apple"とか"Fruits_Orange"とかを // 文字列に代入したい std::string fruitsName = "Fruits_Apple"; }

  • C言語

    (a) キーボードから入力された文字列をそのままディスプレイに表示するプログラムを作成しなさい。 という問題 #include<stdio.h> main() { char word[1000]; /*文字型の変数の宣言*/ scanf("%s", word); /*キーボードから文字列を入力*/ printf("%s\n", word); /*入力した文字列を出力*/ } と作りましたがこれではコンソール中で文字を打ってからエンターを押さないといけないからといわれ再提出になってしまいました。 エンターを押さないでそのまま出力するということは、できるのでしょうか? あと自分の作ったプログラムではスペースや改行を使うことができないから使えるようにしろと言われてましたがそれわできますか? 変換仕様をかえればいいのですか ほかにもかえる所はありますか?

  • C言語のプログラムについて

    大学のテストの確認をしているのですが、この問題の回答がどうしても分かりません。どなたか教えてください。 9桁以内の整数を入力し、int型の変数に格納し表示するプログラムを作成しなさい。 ただし、先頭は、数字か「+」か「-」とし、それ以外はすべて数字とする。この条件に合わないものおよび10桁以上のものは、「入力エラー」として表示後、再入力を行うこと。 例えば「-123456」や「45678989」は、整数としてint型の変数に格納し、「abcd」や「123-234」は、「入力エラー 」を表示し、再入力を行う。 ---------------------------------------------------------------- また、自動判定の都合上、表示は以下の表示例に準拠すること。 【 23-234 *12345 -123456 を入力した例】 入力エラー 入力エラー 整数は、-123456 です。 お願いします

  • C言語 エラー

    void kbd2(int *n, int *m, int w, int z){ int p=0; while(p==0){ while(p!=2){ printf("Type two integers:"); p=scanf("%d%d", n,m); if(p!=2){ scanf("%*s"); printf("Error: Not an integer!\n"); p=0; } else { if(0>*n || 0>*m || w<*n || z<*m){ scanf("%*s"); printf("Error: Out of range!\n"); p=0; } } } } } C言語にて、非負整数を2つ入力しようとしているのですが、main関数内でw=3,z=4にし、キーボード入力でw,z以上の数値を入力するとそこから先が止まってしまいます。(エラーメッセージがでません) しかし、そのあとに0以上w,z以下の整数を入力すると、*nまたは*m(w、z以上に入力したほう)がw、z以上の数値(始めに与えた数値)としてでてきます。 どこが悪いのでしょうか? 改善すべき点を教えてください。。。 なお、scanfは使う方向性でよろしくお願いします。 ちなみに、main関数内はこれです。 int main(){ int va=-1; int vb=-1; int amax=3; int bmax=4; kbd2(&va, &vb, amax, bmax); printf("OK: %d,%d", va, vb); return 0; }

  • C言語 データ

    今キーボードで入力された数字のデータを、あるアドレスのデータに書き込むという学習をしています。 #define Dout 035E ~~~~ printf("KEY INPUT\n"); scanf("%d",&c); outp(Dout,0xc); printf("035E:%x\n",Dout); 035Eというアドレスを定義したあとに、この文面ではDoutにscanfで入力された 数字は、outp(Dout,0xc);この中のcにデータとして書き込むのは出来ないのでしょうか? 例えば、0が入力されれば0を書き込み、1が入力されれば1を書き込むというプログラム にしたいと思っています。 教えていただけないでしょうか?

  • C言語について

    今、大学の授業でやさしいC第3版という本をつかってC言語の勉強していてわからない問題が出てきたので質問させてください。 問題9 Char型の変数ChとInt型の変数nを宣言し アルファベットの大文字1文字と 整数1つを入力させて 次の2つの事を実行する実行ファイルを作成せよ。 1.その文字を表示する。 2.文字コードを使ってその文字をn文字シフト させた文字を表示する。 Q: Zを1文字シフトさせた時Aが出力されるようにするには どうしたらよいか?アスキーコード表をにらんで考えよ。 問題10 キーボードから身長と体重を入力させて BMIを計算して表示する実行ファイルを 作成せよ。 BMI(Body Mass Index)とは 身長と体重から求める体格指数の1つで 身長 H (m)、体重 W (kg) の時 BMI=W/H2 で求められる。 これはまだ最初の方で第3章から第5章までのところをやっています。

  • 列挙体(enum)と関数教えてください。

    下記、勉強中の本から抜粋したものです。 main関数の中のenum animal selected;が呼び出されたあと、 どのように読んで?進んでいったらよいのでしょうか? enum(列挙体)のenum animal { Dog, Cat, Monkey, Invalid };が 0,1,2,3,の働きをするということは、enum animal select(void)関数 に続くということでしょうか? 本の中に、enum animalが型名、 selectedが変数の宣言となってることも わかりません。ただmain関数で宣言しているだけなのでしょうか? switch文の中の (selected = select())もどういう意味なのでしょうか? enum(列挙体)とenum animal select(void)関数の関係や、 main関数の中のenum animal selected;、 switch文の中の (selected = select())などの説明していただける方 教えてください。よろしくお願いします。 #include <stdio.h> enum animal { Dog, Cat, Monkey, Invalid }; void dog(void) {      puts("ワンワン!!"); } void cat(void) {      puts("ニャ~オ!!"); } void monkey(void) {      puts("キッキッ!!"); } enum animal select(void) {      int tmp;      do {           printf("0…犬 1…猫 2…猿 3…終了:");           scanf("%d", &tmp);      } while (tmp < Dog || tmp > Invalid);      return (tmp); } int main(void) {      enum animal selected;      do {           switch (selected = select()) {                case Dog : dog(); break;                case Cat : cat(); break;                case Monkey: monkey();break;           }      } while (selected != Invalid);      return (0); }