【C++入門】標準入力ストリーム(std::cin)の使い方をわかりやすく解説
std::cinは、char型などのナロー文字(半角文字)を扱う標準入力ストリームを表す、istreamクラスのオブジェクトです。C言語のstdinストリームに相当するものです。標準入力ストリームとは、実行環境によって決定される文字の入力元を指し、一般的にはキーボードやファイルなど、外部ソースからの入力であるとみなされます。
std::cinはistreamクラスのオブジェクトであるため、抽出演算子(operator>>)を使って書式化されたデータとして文字を読み取ることもできますし、readなどのメンバー関数を使って書式化されていない生データとして読み取ることも可能です。なお、このオブジェクトはヘッダー<iostream>内で外部リンケージおよび静的な記憶域期間を持つものとして宣言されており、プログラムの実行開始から終了までの間、常に存在しています。
std::cinを使うことで、標準入力から変数へ値を読み込むことができます。例えば、int型の値を変数my_intに読み込み、その内容を画面に表示したい場合は、次のように記述します。
サンプルコード
#include<iostream>
int main() {
int my_int;
std::cin >> my_int;
std::cout << my_int;
return 0;
}
このプログラムを「hello.cpp」という名前で保存しましょう。その後、ターミナル(Windowsではコマンドプロンプト)でファイルを保存したディレクトリへ移動し、以下のコマンドでコンパイルを行います。
$ g++ hello.cpp
コンパイルが完了したら、次のコマンドでプログラムを実行します。
$ ./a.out
実行結果
キーボードから「15」を入力すると、画面には次のように出力されます。
15
std::cinを使う際のポイント
std::cinを使用する際には、いくつか押さえておくとよい特徴があります。
空白文字は自動的にスキップされる
抽出演算子(>>)による読み取りでは、先頭のスペース・タブ・改行などの空白文字は自動的に無視されます。そのため、ユーザーが数字の前に余分な空白を入力しても、正しく値を読み取ることができます。
複数の値を連続して読み込める
抽出演算子は連結して記述できるため、1行で複数の変数に入力を受け取ることも可能です。
int a, b; std::cin >> a >> b; // 「10 20」のように空白区切りで入力
入力が失敗した場合の挙動に注意
例えばint型の変数に対して文字列を入力すると、読み取りに失敗し、ストリームはフェイル状態になります。フェイル状態のストリームは以降の読み取りをすべて無視するため、実用的なプログラムではif文による入力チェックや、std::cin.fail()・std::cin.clear()などを使ったエラー処理を組み合わせるのが一般的です。
-
C++で解くTwo Sum IV ― 二分探索木(BST)が入力の場合
問題概要 二分探索木(BST)とターゲット値が1つ与えられます。このとき、BST内に「2つの要素の和がターゲット値と等しくなる」ような組み合わせが存在するかどうかを判定するのが本問題です。 例えば、次のような木が入力として与えられた場合を考えてみましょう。 この場合、出力は True(真)となります。 解法のアプローチ この問題は、BSTを中間順(inorder)走査して昇順の配列を作り、その後「双方向ポインタ(two pointer)」を使うことで効率的に解けます。具体的には、以下の手順に従います。 値を格納するための配列 v を定義します。 関数 inorder() を定義します(引
-
【C++入門】ストリームクラスの階層構造と入出力の基本を徹底解説
C++におけるストリームとは C++における「ストリーム」とは、プログラムと入出力(I/O)デバイスの間でやり取りされる文字データの流れを指します。 ストリームクラスは、ファイルや入出力デバイスに対する入出力操作を扱うためのクラス群です。それぞれのクラスが固有の役割を持っており、プログラムの入力・出力を効率的に処理できます。 C++のすべてのストリームクラスは、iostreamライブラリにまとめられています。 まずは、ストリームクラスの階層構造を見てみましょう。 iostreamライブラリの主要クラス iosクラス iosクラスは、すべてのストリームクラスの基底クラス(ベースクラス)です。