- ベストアンサー
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」だけだとうまくいかないのはどうしてでしょうか? 初歩的な質問で申し訳ないのですが、教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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 で試してみたところ、?が出力されました。
その他の回答 (2)
- jacta
- ベストアンサー率26% (845/3158)
他の方の回答にもあるように、%cに対応するのはchar型です。また、書式指定が間違っていた場合や、対応する実引数が不足していた場合の動作は未定義ですので、(常識的に考えれば)aの型をcharにする以外の選択肢はありません。
お礼
ありがとうございます。 おかげさまで解決できました。 アドバイスいただいたとおり、型をcharにかえることにしました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
int a; としているためにscanfには、4バイトの領域のアドレスが渡されています。 なので、多分、メモリ上のゴミがaに含まれるのだと思います。 int a=0; としておくか char a; とするのがいいと思います。
お礼
ありがとうございます。 おかげさまで解決しました。
お礼
ありがとうございます。 おかげさまで解決しました。