• ベストアンサー

\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)の繰り返しが続くだけになってしまいます。これはどこか問題あるでしょうか?

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

反応しないのではなく menu関数で実行するprintf("\x1b[2J");により メイン側での出力がクリアされてしまっているため実行結果が変化しないように思われているのではないでしょうか printf("\x1b[2J");をmainのwhileループに入る前で実行して menuからは削除してみましょう

wachi888
質問者

お礼

その通りでした。お二方とも有難うございました。助かりました。

その他の回答 (1)

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

改行が無いせいで出力バッファがフラッシュされないのでは? 改行を入れるかstdoutをflushすれば良いと思います。 ちなみに、これ、NT系のWindowsでは(多分、期待通りには)動きませんよ。

関連するQ&A

  • 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言語の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("明記してあるどれかの数字を再入力してください"); } }

  • 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; }

  • swich文を使って・・・

    swich文を使って、標準入力された数値を3で割った余りが 0のとき「hello world」 1のとき「こんにちわ」 2のとき「おつかれさまです」 と表示される、プログラムを作れ。 という問題なんですが、よく分かりません。 一応作ってみたんですが、違っているようです。。。 #include <stdio.h> void main(void) { int a,b,c,d; printf("数字を入力してください"); scanf("%d",&a); swich(a) { case 'b': printf("hello world",b=a%3==0); break; case 'c': printf("こんにちわ",c=a%3==0); break; case 'd': printf("おつかれさまです",d=a%3==0); break; } }

  • 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初心者です。どうかお助けを

    独習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文を使ったプログラミング

    switch文を使って1のときは円周、2のときは円の面積、3のときは球の面積を求めるという問題をしています。xが1の時は出力結果は合っているのですが、xが2と3のときはdefaultの結果の"もう一度やり直し"になってしまいます。 どこが間違っているのかわかりません。 rは半径、Lは円周、Sは円の面積、Vは球の体積です。paiはπです。 #include<stdio.h> #include<stdio.h> int main(void){ double L, x, r, S, V, pai=3.14159; printf("半径rを入力:"); scanf("%lf",&r); printf("処理番号(1:円周は 2:円の面積は 3:球の体積は)"); scanf("%lf",&x); switch(x){ case 1: L = 2*pai*r; printf("円周は%0.2lf",L); break; case 2: S = pai*r*r; printf("円の面積は%0.2lf",S); break; case 3: V = 4*pai*r*r*r/3; printf("球の体積は%0.2lf",V); break; default: printf("もう一度やり直し\n"); } return 0; }

  • while文について、c言語です。

    ぼくはプログラム始めたばかりです。ミスを見つけられた方、ご指導お願いします。 正整数nを入力して、nの階乗をもとめるプログラムを作りたいのですが、実行結果がいつも1になります。どこがおかしいか教えてください。以下のプログラムです。 #include <stdio.h> int main(void) { int i, n, s; printf("n = ?"); scanf("%lf", &n); s = 1; i = 1; while(i <= n) { s = s * i; i = i + 1; } printf("s = %3d\n", s); return 0; }

  • C言語での数字の花形表示

    数字を読み込んで、それを花形を使った文字で表示するプログラムを書いたのですが、自分の書いたプログラムだと、読み込む数字の最初、または最後に0がくるとそれは表示してくれません・・・。 tmp-=top*s2としているから当たり前っちゃあ当たり前なんですが・・・。 そこでこのプログラムをどのように変更したら最初と最後に0を含んでいても表示できるようになるでしょうか?? やはり根本から作り直さなければいけないんでしょうか・・・。 /* 読み込んだ整数を*で表示 */ #include<stdio.h> int main(void) { int no; int dig = 0; int top, tmp, i; int s=1, s2; printf("整数を入力してください:"); scanf("%d", &no); tmp = no; while (tmp > 0) { /* noの桁数を求める */ tmp /= 10; dig++; } for (i = 0; i < (dig-1); i++) s *= 10; tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" ****"); break; case 1 : printf(" *"); break; case 2 : printf(" ****"); break; case 3 : printf(" ****"); break; case 4 : printf(" ** "); break; case 5 : printf(" ****"); break; case 6 : printf(" ****"); break; case 7 : printf(" ****"); break; case 8 : printf(" ****"); break; case 9 : printf(" ****"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" * *"); break; case 1 : printf(" *"); break; case 2 : printf(" *"); break; case 3 : printf(" *"); break; case 4 : printf(" * * "); break; case 5 : printf(" * "); break; case 6 : printf(" * "); break; case 7 : printf(" * *"); break; case 8 : printf(" * *"); break; case 9 : printf(" * *"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" * *"); break; case 1 : printf(" *"); break; case 2 : printf(" ****"); break; case 3 : printf(" ****"); break; case 4 : printf(" ****"); break; case 5 : printf(" ****"); break; case 6 : printf(" ****"); break; case 7 : printf(" *"); break; case 8 : printf(" ****"); break; case 9 : printf(" ****"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" * *"); break; case 1 : printf(" *"); break; case 2 : printf(" * "); break; case 3 : printf(" *"); break; case 4 : printf(" * "); break; case 5 : printf(" *"); break; case 6 : printf(" * *"); break; case 7 : printf(" *"); break; case 8 : printf(" * *"); break; case 9 : printf(" *"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" ****"); break; case 1 : printf(" *"); break; case 2 : printf(" ****"); break; case 3 : printf(" ****"); break; case 4 : printf(" * "); break; case 5 : printf(" ****"); break; case 6 : printf(" ****"); break; case 7 : printf(" *"); break; case 8 : printf(" ****"); break; case 9 : printf(" ****"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); return(0); }

  • 矢印キーの反応が悪くなります

    このコードをmain関数とキーコントロール関数とに分けたところ、 キーのレスポンスがわるくなりました。 このソースコードをどのように分割すれば一つのファイルで書いたように、 動いてくれるのかわかりません。 よろしくお願いします。 /* 分割前のソースコード */ #include <stdio.h> #include <conio.h> int main(int argc, char *argv[]){ int key=0; while(key!='q'){ //終了キー 'q' key=_getch(); //Keyによって分岐 switch((key == 0x00 || key == 0xe0) ? _getch(): key) { case 0x48:printf("上");break;//上 case 0x50:printf("下");break;//下 case 0x4b:printf("左");break;//左 case 0x4d:printf("右");break;//右 default:break; } } return 0; } /*--ここから下が分割してみたソースコード---*/ /* arrowkey.h */ #ifndef ARROWKEY_H #define ARROWKEY_H int arrowkey(void); #endif //ARROWKEY_H /*---------------------------------*/ /* arrowkey.c */ #include <stdio.h> #include <conio.h> #include "arrowkey.h" int arrowkey(void){ int key=_getwch(); //Keyによって分岐 switch((key == 0x00 || key == 0xe0) ? _getch(): key) { case 0x48:printf("上");break;//上 case 0x50:printf("下");break;//下 case 0x4b:printf("左");break;//左 case 0x4d:printf("右");break;//右 case 0x71:break;//終了 default:break; } return key; } /*---------------------------------*/ /* main.c */ #include "arrowkey.h" int main(int argc, char *argv[]){ int key=0; while(key!='q'){ //終了キー 'q' key=arrowkey() } return 0; }