こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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」だけだとうまくいかないのはどうしてでしょうか?

初歩的な質問で申し訳ないのですが、教えてください。

投稿日時 - 2005-09-07 17:33:05

QNo.1633417

困ってます

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

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 で試してみたところ、?が出力されました。

投稿日時 - 2005-09-07 18:19:26

お礼

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

投稿日時 - 2005-09-07 18:45:31

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

投稿日時 - 2005-09-07 18:24:57

お礼

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

投稿日時 - 2005-09-07 18:46:47

ANo.1

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

投稿日時 - 2005-09-07 18:08:02

お礼

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

投稿日時 - 2005-09-07 18:43:46