• ベストアンサー

なぜに0が表示されるの?

キー入力を調べるために以下の プログラムを作成したのですが・・・ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main(void) { int inkey = 0; while (1) { inkey = getch(); if (inkey == 0x1b) { break; } printf("%d %x\n", inkey); } } ↑↓→←とかのキーは、 変数inkeyの値を表示する前に、 0 0と表示されます。 なぜなんでしょうか? ほかのキーでは、普通に表示されます。 教えてください。

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

  • ベストアンサー
  • mrt136
  • ベストアンサー率35% (33/92)
回答No.2

まず、cherry_moonさんが書かれている様に、printf() 関数の使い方が おかしいですね。この場合、 printf("%d %x\n", inkey, inkey); と 書くのが正解かも知れませんね。 ただ、ご質問の内容は、何故、矢印キーの場合は、値を表示する前に 0 0 と表示されるのかと言う事なので、意図している回答とは違いますね。 で、何故、0 0 と表示されるかですが、それは、 getch() の仕様です。 リファレンスマニュアル等をもう一度読まれてみてはどうでしょうか? ファンクションキー、矢印キーなどは、getch() は2回呼び出されると 書かれているかと思います。また、その1回目は、0、または 0xE0 が 返されると書かれています。

mayoler
質問者

お礼

リファレンスマニュアルとか無いんです。 全部無料の使ってますから。 ありがとうございました。 でも、プログラム自体には、 printf()関数の使い方以外問題は 無かったようですね。 これぐらいのことなら、getch()関数を 検索すればよかったのかなぁ・・・なんて。 (聞いておいてすいませんです。。。) また、お世話になるかもしれませんが よろしくお願いします。

その他の回答 (1)

回答No.1

> printf("%d %x\n", inkey); ここがおかしいです。 printf("%d %x\n", a, b); と書くと、a を 10 進数で、 b を 16 進数で出力する。 という意味です。 mayoler さんの場合、b になるものがありません。 %d か %x のどちらかを消してみて下さい。

mayoler
質問者

お礼

一回やったんですが、 inkey変数を引っ張るのは一回でも、 できるんで、そのままにしちゃったんですけど。。。

関連するQ&A

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

    このコードを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; }

  • なぜかうまく表示されません(原因不明で困ってます)。

    キーを入力するとその入力された文字を表示する、 という単純なプログラムを作成しました。 そこで次のソースを見ていただきたいのですが、 下のこの状態ではうまくいきます。 ところが、余計についているはずの「int t;」を取ると、 表示される文字に余計なものがくっついてきてしまいます。 プログラムをどうみても「t」を使っている箇所はなく、 原因がさっぱりつかめません。 ソースの解読、大変お手数をおかけしますが、 原因を教えていただけないでしょうか。 よろしくお願いいたします。 ---------以下ソース------------- #include <stdio.h> #include <string.h> #include <conio.h> int main(void) { while(1) { char i[40]; int t; i[0]=getch(); if(strcmp(i,"q")==0 || strcmp(i,"Q")==0) break; printf("%s ",i); } return 0; }

  • C言語での方向キー入力判定

    C言語でキーの入力判定をするプログラムを作ってい ます。下の例だとeやエンターを押したときは認識できる のに、方向キー↑を押したときはなぜか無反応です。 コンパイラはボーランドでOSはXPでコンパイルした のですが、何がいけなかったのでしょうか? #include <stdio.h> #include <conio.h> #include <windows.h> void check(void){ int key; key = getch(); switch (key){ case 'e': puts("e"); break; case VK_RETURN: puts("ENTER"); break; case VK_UP: puts("UP"); break; } } int main(void) { while(1){ check(); } return 0; }

  • 何を行っているのか分かりません(C言語)

    #include <stdio.h> #include <stdlib.h> #include <conio.h> enum transport {car, train, airplane, bus} tp; char trans[][20] = { "車", "電車", "飛行機", "バス" }; int main(void) { printf("キーを押して移動手段を選んでください: "); /* プログラムを実行するたびに新しい乱数を生成する */ while(!kbhit()) rand(); getch(); /* 文字を読み込んで廃棄する */ tp = rand() % 4; printf("%s", trans[tp]); return 0; } 【質問】 上記のプログラムで while(!kbhit()) rand(); getch(); のコードが全体的に何を行っているのか分かりません。 1.「while(!kbhit())」でキーが押されたら繰り返しを終了する。 2.繰り返しが終了するまで「rand();」で乱数を発生し続ける。 ぐらいしか分かりません。 「文字を読み込んで廃棄する」コメントはどういう事なのか分かりません。 教えて頂けないでしょうか?

  • C言語でタイミングを合わせるゲームを作っているのですが・・・。【getch()】

    C言語で壁に向かって衝突していくボールをタイミングよくスペースキーを押すことで打ち返すプログラムを作っています(多分実行しないと分かりにくいかも)。 そこでキーの入力にgetch()関数を使っていますが、これだと何かキーが入力されるまで永遠と待ち続けてしまうので、タイミングが100%合ってしまいます。 そこで指定された秒数だけキーの入力を受け付けるような方法を探しているのですが、そのようなものはあるのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <windows.h> int main(void){ int key=0,ballichi=0,i,i2; system("cls");//画面の初期化 for(i=0;i<10;i++){ for(i2=0;i2<10;i2++){ if(ballichi==i2){printf(" o"); }else{printf(" ");} } printf("|壁"); if(i==9){ key = getch(); //キーから一文字入力 switch (key) { /* キー入力チェック */ case ' ': printf("スペースキーが押されました"); break; } } Sleep(500); ballichi++; system("cls"); } return 0; }

  • このプログラムを見てください(C言語) m( _ _ )m

    現在乱数を使ったプログラムを作っています。 下のプログラムでコンパイルではエラーがでませんが、実行するとデバッグエラーが出てきます。コンパイラにはbccを使っています。恐らく原因は別の関数でbに値を代入してそれをaに代入しているからだろうと思いますが、なぜこれがいけないのかが分かりません。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> int ran, a=1, b, c; void test(void){ b=8; } void main(){ srand(time(NULL)); a=b;//ここを無くすとなぜかエラーが出ない。 while(1){ ran=rand()%(a*2)+1; switch(ran){ case 1: c=1; break; case 2: c=1; break; case 3: c=1; break; case 4: c=2; break; case 5: c=2; break; case 6: c=3; break; case 7: c=3; break; case 8: c=4; break; } printf("%d",c);printf("何か押してください\n");getch(); } }

  • C言語プログラム

    したのプログラムでgetch()の代わりにscanf()を使って、入力した数が負なら終了、正なら"次の数を入力してください"と表示してループを続けるプログラムを作りたいのですが、どこを変えればよいのですか? #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c='m'; while(c!='e')//eでない限りwhileループを実行する { sum=sum+i; printf("\n1 kara %d madewo tasuto %d desu.\n",i,sum); i++; printf("nanikakeywo oshitekudasai.owaru tokiha 'e'\n"); c=getch(); } printf("loopwo nukemashita\n"); getch(); }

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

  • c言語

    #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c=\'m\'; while(c!=\'e\')//eでない限りwhileループを実行する { sum=sum+i; printf(\"\\n1 kara %d madewo tasuto %d desu.\\n\",i,sum); i++; printf(\"nanikakeywo oshitekudasai.owaru tokiha \'e\'\\n\"); c=getch(); } printf(\"loopwo nukemashita\\n\"); getch(); } while(c!=\'e\')をwhile(c>0)にして実行したい場合はcharをintにかえて、scanfを使わなければならないのはわかりますが、どこを変えればよいか分かりません。ちなみに、while(c>0)に変えた場合に、正の数を入力した後に、「次の数を入力してください」という文を表示してからくりかえす方法をおしえてください。

  • 教えてください。

    いつもお世話になっています。 以下のソースについてですが、ESCキーを入力するとwhile文から抜けたいのですが・・・教えてください。 #include <stdio.h> int main(void) { char ch[128]; while(1){ scanf("%s", ch); if( ch[0] == 0x1B ){ /* キー入力が Esc キーなら、 */ printf("%02X=Esc ",ch[0] ); /* Esc の キーコ-ドを表示して、*/ break; /* while のループを終了する */ } } return 0; }