• ベストアンサー

Switch caseの書き方について

int a; scanf("%c", &a); switch (a) {      case 'w':        printf("a = w\n");        break;      default:        printf("?\n");        break; } 上記のように書いて「w」を入力すつと「?」が返ってきます。 int a,b; scanf("%d %c", &b,&a); で「20w」と入力すると「w」が返ってくるのですが、 「%c」だけだとうまくいかないのはどうしてでしょうか? 初歩的な質問で申し訳ないのですが、教えてください。

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

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

int a; に対して、 scanf("%c", &a); としたことが原因です。 32bitの処理系なら、int型は通常32bit(4Byte)ですが、scanfでそこに1文字分(8bit)の値を入れたため、下位8bit以外は意味のない値が入っている可能性があります。 回避策としては、 A案: int a = 0; と書く。 B案: char a; と書く。 でいかがでしょう? > int a,b; > scanf("%d %c", &b,&a); > で「20w」と入力すると「w」が返ってくるのですが、 私がCygwin + gcc で試してみたところ、?が出力されました。

sprit
質問者

お礼

ありがとうございます。 おかげさまで解決しました。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

他の方の回答にもあるように、%cに対応するのはchar型です。また、書式指定が間違っていた場合や、対応する実引数が不足していた場合の動作は未定義ですので、(常識的に考えれば)aの型をcharにする以外の選択肢はありません。

sprit
質問者

お礼

ありがとうございます。 おかげさまで解決できました。 アドバイスいただいたとおり、型をcharにかえることにしました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

int a; としているためにscanfには、4バイトの領域のアドレスが渡されています。 なので、多分、メモリ上のゴミがaに含まれるのだと思います。 int a=0; としておくか char a; とするのがいいと思います。

sprit
質問者

お礼

ありがとうございます。 おかげさまで解決しました。

関連するQ&A