これは非常に単純な質問だと思いますが、単純な答えを見つけることができません。、 などの無限ループがありwhile(1)
、for(;;)
キーを押すとループから抜け出す必要があります。これを行う最も簡単な方法は何ですか?
PS: getch
、cin.ignore
、またはは使用できませんcin.get
。ループが停止するためです。
これは非常に単純な質問だと思いますが、単純な答えを見つけることができません。、 などの無限ループがありwhile(1)
、for(;;)
キーを押すとループから抜け出す必要があります。これを行う最も簡単な方法は何ですか?
PS: getch
、cin.ignore
、またはは使用できませんcin.get
。ループが停止するためです。
さて、あなたが望むのは非同期入力です。cin
wait for enterによって提供されるすべてのメソッド。そのためには、システム固有の関数を使用するか、それを行うライブラリを使用する必要があります。
必要なことは、while ループでロジックを処理するだけでなく、OS からのメッセージ パイプをリッスンすることです。それについてさらに情報が必要な場合は、コメントを残してください。
編集:別の方法が1つありますが、移植できない可能性があるため、お勧めしません。次のコードは、VS2012RC でコンパイルおよび実行されます。
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
cout << "Enter a character";
getch();
}
kbhit()
以下は、無限ループを使用する Windows コンソール コードです。ただし、キーボードがヒットすると、ループが中断されて終了します。持っている場合は<conio.h>
、これを試してください:
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
while (1)
{
if (kbhit()) break;
}
return 0;
}
C++には「キーボード」はありません。不透明な入力データストリームしかなく、端末には独自のキーボード入力がときどき入力されます。これはほとんどの場合、バッファリングされた編集可能な行単位の入力であるため、特定のキーがいつ押されたかを知る方法はありません。
下位レベルの端末と直接通信するには、プラットフォーム固有の方法が必要です。そのようなライブラリの1つは、かなり広く普及していて移植性がncurses
あります(互換性のあるWindowsバリアントが存在します)。SDLやAllegroなどのポータブルグラフィカルアプリケーションフレームワークも、生のキーボード処理を提供します。
これは、「左矢印」が押されているかどうかを確認します。
GetKeyState(VK_LEFT)
また、これは何も待ちません。いくつかのフラグをチェックするだけです。
winuser.h で定義されているその他のキー:
#define VK_NUMPAD0 0x60
#define VK_NUMPAD1 0x61
#define VK_NUMPAD2 0x62
#define VK_NUMPAD3 0x63
#define VK_NUMPAD4 0x64
#define VK_NUMPAD5 0x65
#define VK_NUMPAD6 0x66
#define VK_NUMPAD7 0x67
#define VK_NUMPAD8 0x68
#define VK_NUMPAD9 0x69
#define VK_CLEAR 0x0C
#define VK_RETURN 0x0D
#define VK_SHIFT 0x10
#define VK_CONTROL 0x11
#define VK_MENU 0x12
#define VK_PAUSE 0x13
#define VK_CAPITAL 0x14
#define VK_KANA 0x15
#define VK_HANGEUL 0x15 /* old name - should be here for compatibility */
#define VK_HANGUL 0x15
#define VK_JUNJA 0x17
#define VK_FINAL 0x18
#define VK_HANJA 0x19
#define VK_KANJI 0x19
#define VK_ESCAPE 0x1B
#define VK_CONVERT 0x1C
#define VK_NONCONVERT 0x1D
#define VK_ACCEPT 0x1E
#define VK_MODECHANGE 0x1F
#define VK_SPACE 0x20
#define VK_PRIOR 0x21
#define VK_NEXT 0x22
#define VK_END 0x23
#define VK_HOME 0x24
#define VK_LEFT 0x25
#define VK_UP 0x26
#define VK_RIGHT 0x27
#define VK_DOWN 0x28
#define VK_SELECT 0x29
#define VK_PRINT 0x2A
#define VK_EXECUTE 0x2B
#define VK_SNAPSHOT 0x2C
#define VK_INSERT 0x2D
#define VK_DELETE 0x2E
#define VK_HELP 0x2F
winuser.h を windows.h に含める必要があります