• ベストアンサー

関数について

C言語の関数プログラムで、月を入力すると季節を表示する関数を作っているのですが、上手くいきません・・・。何か違うのでしょうか。 #include <stdio.h> void month(int a) { switch(a) { case '3': case '4': case '5': printf("春です。"); break; case '6': case '7': case '8': printf("夏です。"); break; case '9': case '10': case '11': printf("秋です。"); break; case '12': case '1': case '2': printf("冬です。"); break; default: printf("そのような月はありません。"); break; } } int main(void) { int m; printf("月を表示してください:"); scanf("%d",&m); month(m); return 0; }

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

  • ベストアンサー
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.3

month関数のcaseの記述に問題があるからです。 '1'のように、シングルクォートで数字を囲うと、 数字ではなく、ASCIIコードとして扱われます。 ASCIIコード http://www.psl.ne.jp/perl/pdojo00b.html つまり、case '1'はcase 0x31と書いたのと同じになります。 素直にシングルクォートを取り去って、 case 1: のようにすればうまくゆくでしょう。

snoopy100
質問者

お礼

詳しい解説ありがとうございます。できました!!

その他の回答 (2)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

case '3' のように、int と char を比較しているからだけど、switch 文を使うのを止めましょう。 特に、fall through するようなプログラムを書いちゃダメ。

snoopy100
質問者

お礼

switch文を使わないでできるやり方考えてみます!ありがとうございました!

回答No.1

文字と数字は違います。 ASCIIコードで表すと、明確になります。 例えば、'0'(0という文字) は 48(10進数)となります。 ’(シングルクォーテーション)で囲むと文字として扱われます。 今回の場合、引数aは普通の数を表すものなので、 case '3':などではなく、case 3:と表さなければ意味がありません。

snoopy100
質問者

お礼

ありがとうございます。できました!!

関連するQ&A

専門家に質問してみよう