【C++】キーボード入力を取得するgetchとgetchar関数
- 作成日:2024/10/20
標準入力のcinを使わずにキーボードからの入力を取得する方法です。
getchとgetchar関数とは
どちらもキーボードからの入力を「1文字」取得する関数です。 取得するのは1文字なので、複数の文字を取得したい場合はループ処理が必須です。
getchとgetcharの違い
大きく2つの違いがあります。
1つ目は、文字の取得時のちがいです。 getcharは入力し終えたらEnterキーを押下することで文字を取得しますが、 getchは入力した瞬間に文字を取得します。
2つ目は、表示方法のちがいです。 getcharは入力したらその文字がコンソールに出力されますが、 getchは出力されません。
どっちを使う?
どちらを利用するかはケースバイケースですが、押下した瞬間に処理したい場合や、 コンソールに入力したものを出力させたくない場合はgetchが良いでしょう。
一方で、入力したものがわかるようにしておきたい場合はgetcharを使いましょう。
使い方
サンプルを用いて使い方を紹介します。
getch関数
以下のコードは1文字を取得する例です。
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
char ch = getch();
cout << "入力したもの:" << ch << endl;
return 0;
}
キーボードで「a」と入力した瞬間、以下のような結果が表示されます。
入力したもの:a
getchar関数
以下のコードも1文字を取得する例です。
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
char ch = getchar();
cout << "入力したもの:" << ch << endl;
return 0;
}
キーボードで「a」と入力してEnterキーを押下すると、以下のような結果が表示されます。
入力したもの:a
getchと違い、入力値がコンソールに出力されるのがわかるでしょう。
複数の文字を取得する
少し応用です。getchを使い複数の文字を取得してみましょう。 適当な文字列を入力してTabキー押下時に入力したものを出力する例です。
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
int main()
{
string tmp;
char ch;
while (1)
{
//1文字取得
ch = getch();
//文字連結
tmp = tmp + ch;
//Tabキーが押下された場合
if (GetAsyncKeyState(VK_TAB))
{
break;
}
}
cout << "入力したもの:" << tmp << endl;
return 0;
}
キーボードで「abcdef」と入力してTabキーを押下すると、以下のような結果が表示されます。
入力したもの:abcdef
15行目で1文字取得し、それを文字列tmpに格納しています。 キーが押下されたかどうかはGetAsyncKeyState関数を使います。 今回は引数にTabを指定していますね。
Tabが押下されるまでは文字の取得・連結を繰り返すコードになっています。
ちなみに、getcharだとEnterキーを押下しないと文字取得ができないため、 このサンプルではうまく動かないのでご注意ください。
getch関数が使えない?
端的に書きますが、私の環境ですとeclipceのコンソールだとgetchがうまく動作しませんでした。 他の環境は未調査ですが、VSCだと正常に機能したのでgetchが使えない場合は別の開発環境を試してみると良いでしょう。