14歳の自分に衝撃の事実を告げてください

無限ループさせているwhileやfor文などで、
何かのキーを押すとループを抜けるように設定したいのですが可能でしょうか?
(scanfやcinなどをループの中に組み込まずに。ctrl+Cも無しで。)
(あと、フォーム上ではなくコンソール上で。)


多分説明不足なのでもうちょっと詳しく。

たとえば、

while ( i != 1 ){
j += 1;
}

の様な無限ループを設定したとして、

本来なら
if (j > 100 ){ break; }
とか、

while文の中に
scanf ( "%d" , &i );
等を入れて終了条件を満たさせるべきですが、

そうではなく、ひたすら無限ループを続けているところにEscキーを押すとループから脱出するようなプログラムを作ってみたいのです。

そういうプログラムは可能でしょうか?
どうかご教授下さい。

使用コンパイラ:Visual C++ 2008 Express Edition

A 回答 (2件)

★アドバイス


・Windows OS で VC++ ならば kbhit() 関数が便利です。

使用例:
#include <conio.h>

// ESCのキーコード
#define ESC (0x1B)

int main( void )
{
 while ( !kbhit() || (getch() != ESC) ){
   :
  無限ループ処理
   :
 }
 return 0;
}

解説:
・kbhit()関数はキーバッファにキー情報があるかどうかを調査します。
 これによりキーバッファがないときは while 文中が『真』となりループ。
・キーバッファがあるときは while 文中で getch() 関数より1文字取得。
 ここで ESC キー以外なら無限ループ、ESC キーなら無限ループを抜けます。
・なお kbhit() 関数は非標準の関数です。
 VC++なら conio.h ヘッダがあり利用できます。
    • good
    • 1
この回答へのお礼

動作しました!
処理動作にあまり負担をかけなさそうなので、これも使ってみたいと思います。

アドバイスありがとうございました。

お礼日時:2008/11/07 17:38

別スレッドで入力を待つ



#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <process.h>
#include <conio.h>
#include <intrin.h>

long esc;
void key (void *dummy)
{
while (1)
{
if (0x1b == _getch ())
{
_InterlockedIncrement (&esc);
break;
}
}
}
int _tmain (int argc, TCHAR **argv)
{
int j = 0;
_beginthread (key, 0, NULL);
while (1)
{
if (esc)
{
break;
}
printf ("%d\n", j++);
}
return 0;
}
    • good
    • 0
この回答へのお礼

とても早い解答ありがとうございます。
実行してみて、自分が考えていたような動作をしてくれました!
これを参考にプログラムを組んでみようと思います。

あと、これは多分マルチスレッドとか呼ばれるものの類ですよね?
(扱った事がないので詳しくは分かりませんが。)

お礼日時:2008/11/06 23:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A