• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 switch文について)

C言語でのswitch文の挙動について

このQ&Aのポイント
  • C言語でのswitch文の動作についてご質問です。
  • 特定の入力に対して、switch文のcase文とdefault部が両方実行されてしまう現象を調査しています。
  • また、char型からint型に変更した場合に正常に動作することも不可解です。どういった理由によるものでしょうか。

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

  • ベストアンサー
noname#208507
noname#208507
回答No.1

> そうにしろなぜaに対してdefaultへ飛ぶのか理解できませんが・・ キーボードから 'a' [Enter] の順にキーを打って入力するので、1回目のループで'a'を、2回目のループで'\n'をscanf()で受け取ってdefaultを実行してしまいます。 下のように書き換えれば、余分なループについては回避できるでしょう。 #include<stdio.h> int main(void) { char n[2]; int i=0,j=0,k=0; k++; while(scanf("%s",n),*n!='E'){ i++; switch(*n){ ...(以下略)...

MIKI_hito
質問者

お礼

ご回答ありがとうございます。 確かにご教示のとおりに書きなおしてみたら上手くいきました。 もし差支えなければ、以下の点にもう一度ご回答願えると幸いです。 intでnを宣言したらなぜ元のプログラムでうまくいくのか(Enterの'¥n'のint での扱いのせいなのでしょうか)。 よろしくお願いいたします。

その他の回答 (3)

  • ottimisto
  • ベストアンサー率72% (8/11)
回答No.4

結論から言いますと、scanf関数の仕様です。 質問者様のコードですと、 scanf関数は、エンターキーが入力された際、1文字分の文字コードをnに代入します。 この時、エンターキーコードは、バッファメモリに残ったままとなります。 2回めのエンターを押された場合、まず、1回めのエンターキーのコードがnに代入されます。 そのため、質問者様の言われる“不可解”な現象となります。 char n を int n に変更するのみの場合では、現象は変わりません。 (1回目はうまくいくけど、2回め以降はうまくいかない。) 解決策のひとつとしては、scanf("%c",&n)の、"と%cの間に半角スペースを入れてみることです。 (他にもありますが…)

MIKI_hito
質問者

お礼

お礼遅くなり申し訳ありません。 丁寧なご回答ありがとうございます。よくわかりました。 新しい解決策も、感謝です!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「最初の宣言」を int にしたときは scanf の書式も %c ではないはずですね. %c と, そいつや %s がどう違うのか確認してください.

MIKI_hito
質問者

お礼

ご回答ありがとうございます。 なるほど!わかった気がします。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

>(aを入力すると day before yesterday と day after tomorrowが表示されるような感じです) 「aを入力すると」と書かれていますが実際には「aを入力してエンターキーを押すと」ではないですか? もしそうであればaの他に改行('\r'か'\n')の2つが入力されてるかと思います。

MIKI_hito
質問者

お礼

ご回答ありがとうございます。 ご指摘のとおりです。 ただ、int で nを宣言してプログラムを書いた場合には問題なく実行できたのですが、 このちがいは何に起因するのでしょうか・・。 不勉強なので、int や charの基礎的なところで誤解をしているのかもしれませんが・・ もし差支えなければ、ご回答いただけると幸いです。 よろしくお願いいたします。

関連するQ&A