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

switch文とscanfについて

このQ&Aのポイント
  • switch文とscanfについての質問です。
  • プログラムの実行例における二回繰り返される問題について質問があります。
  • また、scanfの呼び出しによる入力待ちの問題についても質問しています。

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

  • ベストアンサー
noname#200952
noname#200952
回答No.4

char型を使いたい理由は分かりますが… どうやら全てint型にすると解決します。 #include <stdio.h> void main(){ int i,s,ch; while (1){ printf("Input 1 or 2\n"); scanf("%d", &s); switch (s){ case 1: printf("Input a number\n"); scanf("%d", &i); printf("You input '%d'\n", i); break; case 2: printf("Input a character\n"); scanf("%d", &ch); printf("You input '%d'\n", ch); break; } } }

Kdesky
質問者

お礼

ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

noname#200952
noname#200952
回答No.5

補足 どうやら、scanfを呼ぶと、 sのアドレスがおかしくなってます。

すると、全ての回答が全文表示されます。
  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.3

意図というのが一行ずつ処理したいと言うことなら、 fgetsで1行ずつ読んでみてはどうでしょう。 ======================== /*エラー処理とかはほぼ省略*/ #include <stdio.h> #include <stdlib.h> int main(){ char buf[256]; char *end; long num; while(1){ printf("Input 1 or 2: "); fgets(buf, sizeof(buf), stdin); /*bufには改行文字も含めた1行が入る*/ switch(buf[0]){ case '1' : printf("Input a number: "); fgets(buf, sizeof(buf), stdin); num = strtol(buf, &end, 10); printf("Your input '%ld'\n", num); break; case '2' : printf("Input a character: "); fgets(buf, sizeof(buf), stdin); printf("Your input '%c'\n", buf[0]); break; default: printf("Error\n"); break; } } return 0; } ======================================= scanfは多機能なのですが、 その分挙動がわかりにくいかもしれません。 (%sで空白文字がセパレーター扱いされるとか。) なお、scanfを使う場合の回避策は、wikipediaにも書かれてました。 他の注意点も載ってますね。 http://ja.wikipedia.org/wiki/Scanf#.E6.94.B9.E8.A1.8C.E6.96.87.E5.AD.97.E3.81.AE.E5.8F.96.E3.82.8A.E6.89.B1.E3.81.84

Kdesky
質問者

お礼

ありがとうございました。

すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>意図したとおりに動作するようにプログラムを書き換えるとしたら 「scanf 改行」辺りで検索してみてくださいな。 http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-4-2 とか。 「scanf 改行 読み飛ばし」でも見つかるでしょう。

すると、全ての回答が全文表示されます。
  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.1

どちらも理由は、scanfが改行文字を取得したから。 > You input ' //------(2) > ' この結果とか分かりやすいですよね。 あなたがその手前で入力した 2 という文字列の2文字目の'\n'が出力されています。 (1)の方はswitch文のdefaultを書けば、 '1'でも'2'でもない文字(この場合'\n')が入力されていることが分かります。

Kdesky
質問者

お礼

ありがとうございました。

Kdesky
質問者

補足

意図したとおりに動作するようにプログラムを書き換えるとしたら例えばどのようになるでしょうか。 switch文は使っても使わなくても良いです。

すると、全ての回答が全文表示されます。

専門家に質問してみよう