enumの勉強で月と週を数値で出力したいのですが数値に対応した文字が出ないのですが何が足りないのでしょうか?
c
1#include<stdio.h> 2 3enum week { 4 January, 5 February, 6 March, 7 April, 8 May, 9 June, 10 July, 11 August, 12 September, 13 October, 14 November, 15 December, 16 Monday = 100, 17 Tuesday, 18 Wednesday, 19 Thursday, 20 Friday, 21 Saturday, 22 Sunday 23}; 24 25int main(void) { 26 27 week a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10; 28 29 a0 = (week)0; 30 31 printf("0の値は: %d\n",(week)a0); 32 33 34 return 0; 35}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
ベストアンサー
それぞれの enum の値に対する文字列を持たないといけません。オリジナルのソースの問題点として
- 週と月が同じ enum として定義されている
- typedef していないので警告が出る
c
1#include<stdio.h> 2 3typedef enum { 4 January, 5 February, 6 March, 7 April, 8 May, 9 June, 10 July, 11 August, 12 September, 13 October, 14 November, 15 December, 16} month; 17 18const char* month_names[] = { 19 "January", 20 "February", 21 "March", 22 "April", 23 "May", 24 "June", 25 "July", 26 "August", 27 "September", 28 "October", 29 "November", 30 "December", 31}; 32 33typedef enum { 34 Monday, 35 Tuesday, 36 Wednesday, 37 Thursday, 38 Friday, 39 Saturday, 40 Sunday 41} week; 42 43const char* week_names[] = { 44 "Monday", 45 "Tuesday", 46 "Wednesday", 47 "Thursday", 48 "Friday", 49 "Saturday", 50 "Sunday", 51}; 52 53int main(void) { 54 month a0; 55 a0 = February; 56 printf("%d の値は: %s\n", a0, month_names[a0]); 57 58 week a1; 59 // a1 = February; これは警告が出る 60 a1 = Friday; 61 printf("%d の値は: %s\n", a1, week_names[a1]); 62 63 return 0; 64}
week と month を別の定義にしておけば、week の型に month を入れてしまったとしても警告が出てくれます。
ただし気を付けないといけないのは week_names
や month_names
の添え字として使うのですから0始まりでないといけない事。それと month_names[week1]
の様な事が出来てしまう事です。これはこの様な問題が起きないように専用の関数を作るのが良いのではないでしょうか。
投稿2018/01/26 02:57
編集2018/01/26 02:58総合スコア5030
0
enumは数値を文字に置き換えて記述できるという定義なので、値から文字を得ることはできません。
次のように出力したい文字列を定義しておいて、値と紐づけるような処理が必要です。
c
1#include<stdio.h> 2 3enum week { 4 January, 5 February, 6 March, 7 April, 8 May, 9 June, 10 July, 11 August, 12 September, 13 October, 14 November, 15 December, 16 Monday = 100, 17 Tuesday, 18 Wednesday, 19 Thursday, 20 Friday, 21 Saturday, 22 Sunday 23}; 24 25char *month_str[] = { 26 "January", 27 "February", 28 "March", 29 "April", 30 "May", 31 "June", 32 "July", 33 "August", 34 "September", 35 "October", 36 "November", 37 "December" 38}; 39char *week_str[] = { 40 "Monday", 41 "Tuesday", 42 "Wednesday", 43 "Thursday", 44 "Friday", 45 "Saturday", 46 "Sunday" 47}; 48 49int main(void) { 50 51 int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10; 52 53 a0 = 101; 54 if(a0 < Monday){ 55 printf("%dの値は: %s\n", a0, month_str[a0]); 56 } else { 57 printf("%dの値は: %s\n", a0, week_str[a0 - Monday]); 58 } 59 60 return 0; 61}
投稿2018/01/26 02:58
総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
printf("0の値は: %d\n",(week)a0);
そもそも、printfの"%d"は「整数値を表示せよ」という指定なので、文字列は表示しません。
C言語のenumは単純な整数値です。そして、C言語にはenum値を文字列にする機能はありません。
変数に格納されているenum値を文字列として表示するには、その値に対応する文字列を自分で設定してやらないといけないのです。
とりあえずこんな感じ。
C
1const char *str; 2switch(a0) 3{ 4case January: 5 str = "January"; 6 break; 7case February: 8 str = "February"; 9 break; 10case March: 11 str = "March"; 12 break; 13 14// 以下同様にSundayまで書く 15 16} 17printf("0の値は: %s\n",str);
投稿2018/01/26 02:58
総合スコア5944
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
文字は出ませんよ。
enum は数値です。
次のようにしてください。
投稿2018/01/26 02:36
総合スコア28673
0
プリプロセッサを使うと下記の様な事もできますが、邪道のような気がします。
C
1#include <stdio.h> 2 3#define ENUM_MONTH \ 4 ENUM_ITEM_VALUE(January, 1) \ 5 ENUM_ITEM(February) \ 6 ENUM_ITEM(March) \ 7 ENUM_ITEM(April) \ 8 ENUM_ITEM(May) \ 9 ENUM_ITEM(June) \ 10 ENUM_ITEM(July) \ 11 ENUM_ITEM(August) \ 12 ENUM_ITEM(September) \ 13 ENUM_ITEM(October) \ 14 ENUM_ITEM(November) \ 15 ENUM_ITEM(December) 16 17#define ENUM_ITEM(x) x, 18#define ENUM_ITEM_VALUE(x, n) x = n, 19enum month { ENUM_MONTH }; 20#undef ENUM_ITEM 21#undef ENUM_ITEM_VALUE 22 23#define ENUM_ITEM(x) \ 24 case x: \ 25 return #x; \ 26 break; 27#define ENUM_ITEM_VALUE(x, n) ENUM_ITEM(x) 28 29const char *get_month_str(enum month m) 30{ 31 switch(m){ 32 ENUM_MONTH 33 default: 34 break; 35 } 36 37 return NULL; 38} 39 40#undef ENUM_ITEM 41#undef ENUM_ITEM_VALUE 42 43int main() 44{ 45 enum month m; 46 47 for (m = January; m <= December; m++){ 48 printf("%2d月: %s\n", m, get_month_str(m)); 49 } 50 51 return 0; 52}
投稿2018/01/26 03:56
総合スコア113
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。