- ベストアンサー
ループを途中で抜けたいのですが。
無限ループさせている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
- みんなの回答 (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 ヘッダがあり利用できます。
その他の回答 (1)
別スレッドで入力を待つ #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; }
お礼
とても早い解答ありがとうございます。 実行してみて、自分が考えていたような動作をしてくれました! これを参考にプログラムを組んでみようと思います。 あと、これは多分マルチスレッドとか呼ばれるものの類ですよね? (扱った事がないので詳しくは分かりませんが。)
お礼
動作しました! 処理動作にあまり負担をかけなさそうなので、これも使ってみたいと思います。 アドバイスありがとうございました。