• ベストアンサー

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」だけだとうまくいかないのはどうしてでしょうか? 初歩的な質問で申し訳ないのですが、教えてください。

  • sprit
  • お礼率66% (45/68)

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

  • ベストアンサー
  • 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

  • C言語のswitch文について間違っているところを教えてください

    初めに初心者ですので間違っているところは説明つきの回答をしていただければありがたいです。 今回switch文を使って 「足し算、引き算、掛け算、割り算」のプログラムを作ったつもりなのですが、intを使うと割り算の小数点が出ないしfioat文を使うとswitch文には、使えないと出るしどのようにしたら良いのか御回答よろしくお願いします。 (今は、int文でプログラムを作っているつもりです。) #include <stdio.h> void main (void) { int a,b,k; printf("どのような計算をしたいか数字を選んでください。\n"); printf(" 1.足し算 (例 a+b)\n"); printf(" 2.引き算 (例 aーb)\n"); printf(" 3.掛け算 (例 a×b)\n"); printf(" 4.割り算 (例 a÷b)\n"); printf("計算したい番号を入力してください "); scanf("%d",&k); switch (k){ case 1: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a+b で %d です\n",a+b); break; case 2: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは aーb で %d です\n",a-b); break; case 3: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a×b で %d です\n",a*b); break; case 4: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a÷b で %d です\n",a/b); break; default: printf("明記してあるどれかの数字を再入力してください"); } }

  • switch分のケースを範囲数?にしたい

    #include <stdio.h> int main(void) { int a; scanf("%d",&a); switch(a) { case 1: printf("\nりんご\n"); break; case 2: printf("\nバナナ\n"); break; default: printf("\nその他\n"); break; } return 0; } C言語でプログラム練習しています 上の内容で正常に動くのですが caseのところを例えば 1~10までは りんご 11~30までは バナナ など1つの数字ではなく複数の数字にしたいのですがどうすればいいのでしょうか? 以前VBを少し経験したことがありまして その際は case 1 to 10 でできたのですがC言語ではできないみたいです わかる方教えてください

  • C言語 switch文について

    C言語初心者です。 以下のようにC言語でプログラムを書いてみたのですが、 一つの入力に対して、対応するcase文に加えてdefault部の内容も表示されてしまいます。 (aを入力すると day before yesterday と day after tomorrowが表示されるような感じです) i,j,k などを使ってどう実行されているかを調べると、どうやら一回の入力に対して二回switch部を回っているようです。 そうにしろなぜaに対してdefaultへ飛ぶのか理解できませんが・・ また、最初の宣言をchar から int にして(caseは、case 1とかに適当に変えて)やると、正常に動くのも不可解です。 どうなっているんでしょうか・・ どなたかご教授願えると幸いです。よろしくお願いいたします。 #include <stdio.h> int main(void) { char n; int i=0,j=0,k=0; k++; while(scanf("%c",&n),n!='E'){ i++; switch(n){ case 'a': puts("day before yesterday"); break; case 'b': puts("yesterday"); break; case 'c': puts("today"); break; case 'd': puts("tomorrow"); break; default: puts("day after tomorrow"); break; j++; } } printf("%d\n",i); printf("%d\n",j); printf("%d\n",k); return 0; }

  • c言語についての質問です。

    #include<stdio.h> int main(void){ double a,b; int c; printf("Type two numbers\n"); scanf("%lf",&a); scanf("%lf",&b); printf("Select 1)addition, 2) subtraction, 3)multiplication or 4)division\n"); scanf("%d",&c); switch(c){ case1: printf("%.6f + %.6f = %.6f",a,b,a+b); break; case2: printf("%.6f - %.6f = %.6f",a,b,a-b); break; case3: printf("%.6f * %.6f = %.6f",a,b,a*b); break; case4: printf("%.6f / %.6f = %.6f",a,b,a/b); break; default: printf("Error! Select 1, 2, 3 or 4\n"); break; } return 0; このプログラムをコンパイルして実行しても 正しく動きません。なぜですか?

  • 教えてください

    case4をキャストしたいのですが、どこにdoubleをつければよいのですか?josan(na/nb)の前においたのですがうまく表示されませんでした。教えてください。 #include <stdio.h> int kasan(int a, int b) { return(a+b); } int gensan(int a, int b) { return(a-b); } int jousan(int a, int b) { return(a*b); } int josan(int a, int b) { return(a/b); } int main(void) { int na, nb, nc; puts("二つの整数を入力してください"); printf("整数A"); scanf("%d", &na); printf("整数b"); scanf("%d", &nb); printf("1:加算\n2:減算\n3:乗算\n4除算\n"); printf("1から4までのどれかを入力してください"); scanf("%d", &nc); switch(nc){ case 1: printf("%d+%dは、%dです。\n", na, nb, kasan(na,nb)); break; case 2: printf("%d-%dは、%dです。\n", na, nb, gensan(na,nb)); break; case 3: printf("%d*%dは、%dです。\n", na, nb, jousan(na,nb)); break; case 4: printf("%d/%dは、%fです。\n", na, nb, josan(na,nb)); break; default: printf("番号が違います。\n"); break; } return(0); }

  • switch文とscanfについて

    ソースコード------------------------------------- #include <stdio.h> void main(){ int i; char s, ch; while(1){ printf("Input 1 or 2\n"); scanf("%c", &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("%c", &ch); printf("You input '%c'\n", ch); break; } } } ----------------------------------------------- 実行例----------------------------------------- Input 1 or 2 1 Input a number 4 You input '4' Input 1 or 2 Input 1 or 2 //------(1) 2 Input a character You input ' //------(2) ' Input 1 or 2 ----------------------------------------------- (1)について。 なぜ"Input 1 or 2"が二回繰り返されているのですか。 (2)について。 scanfが呼び出されて入力待ちになることを期待しているのですが、 なぜ(2)のようになってしまうのでしょうか。

  • C言語エラー

    C言語をいじっているのですが、16行目と19行目の「型」の前に「;」がありませんと表示されます。 どこをどう改善すればいいか教えてもらえないでしょうか /*遊び半分*/ #include <stdio.h> #include <process.h> int main() { char dear; printf("ああああ\n"); printf("ああああ \n"); scanf_s("%c", &dear); switch (dear){ case 'A04': ; int main(void); { printf("ああああ\n"); int main(void); printf("あああ\n"); printf("あああ\n"); break; system("pause"); return 0; } case 'C34' : printf("\n"); break; case 'E24' : printf("\n"); break; case 'F38' : printf("\n"); break; default: printf("メッセージはありません\n"); break;} return 0;

  • C初心者です。どうかお助けを

    独習Cという本で独学中なのですが #include<stdio.h> int main() { int a,b; char ch; printf("実行したい演算は\n"); printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか\n"); do{ printf("アルファベットの1文字を入力してください:"); ch=getchar(); while(getchar()!='\n'); }while(ch!='A' && ch!='S' && ch!='M' && ch!='D'); printf("\n"); printf("最初の数字を入力してください:"); scanf("%d",&a); printf("二つめの数字を入力してください:"); scanf("%d",&b); switch(ch){ case 'A': printf("%d",a+b); break; case 'B': printf("%d",a-b); break; case 'C': printf("%d",a*b); break; case 'D': if(b!=0)printf("%d",a/b); } return 0; } このプログラムでの14行目の while(getchar()!='\n');の必要性がわかりません。 どなたか有識者の方の回答をお願いします。

  • switchの使い方を教えてください。

    ある文字を入れて、それを数字か文字か判別するプログラムを作りたいのですがうまく行かないのでご教授ください。 下記のプログラムで作ると0から9までの数字は判別できるのですが、数字が2桁以上になると判別できません。 2桁以上の数字を識別させるにはどうしたらいいのでしょうか? int a; printf("文字を入れて下さい"); scanf("%d",&a); switch ( a ){ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9:      printf("数字です"); break; default: printf("数字以外の文字です");      break; }

  • \x1bを使ったswitch文が反応しない

    int main(void){ int n; while(1){ menu(); scanf("%d", &n); switch(n){ case 1 : printf("\x1b[6;10H%s", "メニュー1を実行します"); break; case 2 : printf("\x1b[6;10H%s", "メニュー2を実行します"); break; case 3 : printf("\x1b[6;10H%s", "メニュー3を実行します"); break; default : printf("\x1b[6;10H%s", "指定数字ではありません"); break; } } return 0; } void menu(void){ printf("\x1b[2J"); printf("\x1b[3;10H%s", "メニュー1"); printf("\x1b[4;10H%s", "メニュー2"); printf("\x1b[5;10H%s", "メニュー3"); } コンパイルは通るのですが、数字を入力しても反応が無くwhile(1)の繰り返しが続くだけになってしまいます。これはどこか問題あるでしょうか?

専門家に質問してみよう