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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

Q&A

解決済

5回答

7715閲覧

C言語 enumについて

BALDRSKY

総合スコア19

C

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

0グッド

0クリップ

投稿2018/01/26 02:27

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ページで確認できます。

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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_namesmonth_names の添え字として使うのですから0始まりでないといけない事。それと month_names[week1] の様な事が出来てしまう事です。これはこの様な問題が起きないように専用の関数を作るのが良いのではないでしょうか。

投稿2018/01/26 02:57

編集2018/01/26 02:58
mattn

総合スコア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

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2018/01/26 02:36

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

catsforepaw

2018/01/26 03:01 編集

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

2018/01/26 03:04

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

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

shsh_

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問