C++ でユーザ入力を待つ方法

  1. ユーザ入力を待つには cin.get() メソッドを使う
  2. ユーザ入力を待つために getchar 関数を使う
  3. ユーザの入力を待つには getc 関数を用いる
  4. ユーザの入力を待つために system("pause") を使わないようにする

この記事では、C++ でユーザー入力を待つ方法を紹介します。なお、以下のチュートリアルでは、ユーザ入力の内容はプログラムの実行には無関係であることを前提としています。

ユーザ入力を待つには cin.get() メソッドを使う

get()std:cin のメンバ関数であり、ストリームから文字を抽出する入力演算子 >> とほぼ同じように動作する。この場合、ユーザ入力の処理に興味がなく、wait 機能を実装するだけでよい場合は、引数なしで get 関数を呼び出すことができます。ただし、この関数は Enter キーが押されたときに戻ることに注意してください。

#include <iostream>
#include <vector>

using std::cout; using std::cin;
using std::endl; using std::vector;
using std::copy;

int main()
{
    vector<char> arr = {'w','x','y','z'};
    int flag;

    flag = cin.get();

    for(auto const& value: arr)
        cout << value << "; ";
    cout << "\nDone !" << endl;

    return EXIT_SUCCESS;
}

出力:

w; x; y; z;
Done !

ユーザ入力を待つために getchar 関数を使う

関数 getchar は入力ストリーム(stdin)から 1 文字を読み込むための C 標準ライブラリ関数である。前のものと同様に、このメソッドも改行文字(つまり Enter キーが押されたこと)が返されることを期待しています。getchar はエラーが発生した場合やストリームの終端に遭遇した場合に eof を返す。

#include <iostream>
#include <vector>

using std::cout; using std::cin;
using std::endl; using std::vector;
using std::copy;

int main()
{
    vector<char> arr = {'w','x','y','z'};
    int flag;

    flag = getchar();

    for(auto const& value: arr)
        cout << value << "; ";
    cout << "\nDone !" << endl;

    return EXIT_SUCCESS;
}

ユーザの入力を待つには getc 関数を用いる

別の方法として、上の例を getc 関数で代用することもできる。getc は任意の入力ストリームから読み込むために FILE *stream 引数を渡すが、ここでは stdin を渡すことにする。この関数は、Enter キーが押されたときにも返す。

#include <iostream>
#include <vector>

using std::cout; using std::cin;
using std::endl; using std::vector;
using std::copy;

int main()
{
    vector<char> arr = {'w','x','y','z'};
    int flag;

    flag = getchar();

    for(auto const& value: arr)
        cout << value << "; ";
    cout << "\nDone !" << endl;

    return EXIT_SUCCESS;
}

ユーザの入力を待つために system("pause") を使わないようにする

system 関数はシェルコマンドを実行するために用いられ、コマンド名は文字列リテラルとして渡される。したがって、pause が引数として渡されると、Windows プラットフォームでのみ利用可能な対応するコマンドを実行しようとする。移植性のない system("pause") の方法を使うよりも、上記のメソッドを使ってカスタムの待機関数を実装するのがベストである。

#include <iostream>
#include <vector>

using std::cout; using std::cin;
using std::endl; using std::vector;
using std::copy;

int main()
{
    vector<char> arr = {'w','x','y','z'};
    int flag;

    system("pause");

    for(auto const& value: arr)
        cout << value << "; ";
    cout << "\nDone !" << endl;

    return EXIT_SUCCESS;
}

出力:

sh: 1: pause: not found
w; x; y; z;
Done !
comments powered by Disqus