質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • C

    3069questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C言語 enumについて

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 226

BALDRSKY

score 13

enumの勉強で月と週を数値で出力したいのですが数値に対応した文字が出ないのですが何が足りないのでしょうか?

#include<stdio.h>

enum week {
    January,
    February,
    March,
    April,
    May,
    June,
    July,
    August,
    September,
    October,
    November,
    December,
    Monday = 100,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
};

int main(void) {

    week a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;

     a0 = (week)0;

    printf("0の値は: %d\n",(week)a0);


    return 0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+4

それぞれの enum の値に対する文字列を持たないといけません。オリジナルのソースの問題点として

  • 週と月が同じ enum として定義されている
  • typedef していないので警告が出る
#include<stdio.h>

typedef enum {
  January,
  February,
  March,
  April,
  May,
  June,
  July,
  August,
  September,
  October,
  November,
  December,
} month;

const char* month_names[] = {
  "January",
  "February",
  "March",
  "April",
  "May",
  "June",
  "July",
  "August",
  "September",
  "October",
  "November",
  "December",
};

typedef enum {
  Monday,
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
  Saturday,
  Sunday
} week;

const char* week_names[] = {
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday",
  "Sunday",
};

int main(void) {
  month a0;
  a0 = February;
  printf("%d の値は: %s\n", a0, month_names[a0]);

  week a1;
  // a1 = February; これは警告が出る
  a1 = Friday;
  printf("%d の値は: %s\n", a1, week_names[a1]);

  return 0;
}

week と month を別の定義にしておけば、week の型に month を入れてしまったとしても警告が出てくれます。

ただし気を付けないといけないのは week_names や month_names の添え字として使うのですから0始まりでないといけない事。それと month_names[week1] の様な事が出来てしまう事です。これはこの様な問題が起きないように専用の関数を作るのが良いのではないでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

enumは数値を文字に置き換えて記述できるという定義なので、値から文字を得ることはできません。
次のように出力したい文字列を定義しておいて、値と紐づけるような処理が必要です。

#include<stdio.h>

enum week {
    January,
    February,
    March,
    April,
    May,
    June,
    July,
    August,
    September,
    October,
    November,
    December,
    Monday = 100,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
};

char *month_str[] = {
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
};
char *week_str[] = {
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday",
    "Sunday"
};

int main(void) {

    int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;

    a0 = 101;
    if(a0 < Monday){
        printf("%dの値は: %s\n", a0, month_str[a0]);
    } else {
        printf("%dの値は: %s\n", a0, week_str[a0 - Monday]);
    }

    return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

printf("0の値は: %d\n",(week)a0);

そもそも、printfの"%d"は「整数値を表示せよ」という指定なので、文字列は表示しません。

C言語のenumは単純な整数値です。そして、C言語にはenum値を文字列にする機能はありません。
変数に格納されているenum値を文字列として表示するには、その値に対応する文字列を自分で設定してやらないといけないのです。

とりあえずこんな感じ。

const char *str;
switch(a0)
{
case January:
    str = "January";
    break;
case February:
    str = "February";
    break;
case March:
    str = "March";
    break;

// 以下同様にSundayまで書く

}
printf("0の値は: %s\n",str);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

文字は出ませんよ。
enum は数値です。
次のようにしてください。

列挙型enumの列挙定数を文字列に変換する方法

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/26 12:01 編集

    マクロだと変数に入っているenum値を文字列にすることはできないのですが。

    キャンセル

  • 2018/01/26 12:04

    そうですね。ですからリンク先を参考にして書き直しになるでしょう。

    キャンセル

0

プリプロセッサを使うと下記の様な事もできますが、邪道のような気がします。

#include <stdio.h>

#define ENUM_MONTH              \
    ENUM_ITEM_VALUE(January, 1) \
    ENUM_ITEM(February)         \
    ENUM_ITEM(March)            \
    ENUM_ITEM(April)            \
    ENUM_ITEM(May)              \
    ENUM_ITEM(June)             \
    ENUM_ITEM(July)             \
    ENUM_ITEM(August)           \
    ENUM_ITEM(September)        \
    ENUM_ITEM(October)          \
    ENUM_ITEM(November)         \
    ENUM_ITEM(December)

#define ENUM_ITEM(x) x,
#define ENUM_ITEM_VALUE(x, n) x = n,
enum month { ENUM_MONTH };
#undef ENUM_ITEM
#undef ENUM_ITEM_VALUE

#define ENUM_ITEM(x) \
    case x:          \
        return #x;   \
        break;
#define ENUM_ITEM_VALUE(x, n) ENUM_ITEM(x)

const char *get_month_str(enum month m)
{
    switch(m){
        ENUM_MONTH
    default:
        break;
    }

    return NULL;
}

#undef ENUM_ITEM
#undef ENUM_ITEM_VALUE

int main()
{
    enum month m;

    for (m = January; m <= December; m++){
        printf("%2d月: %s\n", m, get_month_str(m));
    }

    return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3069questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。