4.

C++のcinの使い方|キーボード入力とgetline・入力失敗の処理

編集

std::cinは、C++でキーボードからの入力を受け取るための標準入力ストリームです。cin >> 変数;と書くことで、利用者がキーボードに打ち込んだ値を変数へ読み込めます。

この記事の要点
  • std::cinは標準入力(通常はキーボード)から値を読み取るストリームで、<iostream>に定義されています。
  • 基本形はstd::cin >> 変数;。抽出演算子>>で右側の変数へ入力を渡します。
  • >>は空白(スペース・タブ・改行)を区切りとして読み取り、cin >> a >> b;のように連結できます。
  • 空白を含む1行をまるごと読みたいときはstd::getline(std::cin, 文字列)を使います。
  • 型に合わない入力があると失敗状態になり、cin.fail()で検知、cin.clear()cin.ignore()で復帰させます。

std::cinとは

std::cinは、C++の標準ライブラリが用意している標準入力ストリームです。プログラムを実行する利用者がキーボードから入力した文字列を、プログラム内の変数へ取り込む役割を持ちます。使うには<iostream>ヘッダをインクルードします。

cinは名前空間stdに属するため、正式にはstd::cinと書きます。ファイル先頭にusing namespace std;を書いた場合はcinと省略できますが、本記事では区別が分かりやすいよう必要に応じてstd::を付けて表記します。

画面への出力を担うstd::coutと対になる存在で、coutが「出力(output)」、cinが「入力(input)」を担当します。

基本的な使い方

もっとも基本的な形は次のとおりです。cinのあとに抽出演算子>>を書き、その右に値を受け取る変数を指定します。

#include <iostream>

int main() {

    int x;

    std::cout << "整数を入力: ";

    std::cin >> x;   // キーボードから値を読み込む

    std::cout << "入力された値: " << x << std::endl;

    return 0;

}

 

実行すると「整数を入力: 」と表示され、利用者が数値を打ち込んでEnterキーを押すと、その値が変数xに格納されます。5と入力すれば「入力された値: 5」と表示されます。

このとき>>は、変数xの型(ここではint)に合わせて入力を解釈します。intなら整数として、doubleなら小数として、std::stringなら文字列として読み取ります。

複数の値を続けて入力する

>>は連結して書けます。1行に複数の変数を並べると、入力を順番に読み込みます。

#include <iostream>

int main() {

    int a, b;

    std::cout << "2つの整数を入力: ";

    std::cin >> a >> b;

    std::cout << "合計: " << (a + b) << std::endl;

    return 0;

}

 

3 5のように空白で区切って入力しても、3(改行)5のように改行で区切って入力しても、どちらもa3b5が入ります。これは>>が空白(スペース・タブ・改行)を区切りとして扱うためです。

抽出演算子(>>)の区切りの仕組み

>>は、入力の先頭にある空白を読み飛ばしてから値を1つ読み取り、次の空白の手前で読み取りを止めます。そのため、空白を含む文字列を1つの変数で受け取ることはできません。

std::string word;

std::cin >> word;   // "Hello World" と入力しても word には "Hello" だけが入る

 

上の例で「Hello World」と入力した場合、wordには最初の単語Helloだけが格納され、Worldは入力ストリームに残ります。

空白を含む行を読む(std::getline)

スペースを含む1行全体を読み込みたいときは、>>ではなくstd::getlineを使います。std::getline(std::cin, 文字列)と書くと、改行までの1行をまるごとstd::stringに読み込みます(末尾の改行は文字列に含まれません)。

#include <iostream>

#include <string>

int main() {

    std::string line;

    std::cout << "名前を入力: ";

    std::getline(std::cin, line);

    std::cout << "こんにちは、" << line << "さん" << std::endl;

    return 0;

}

 

これなら「山田 太郎」のように空白を含む入力も、そのままlineに格納できます。std::stringを使うには<string>ヘッダのインクルードが必要です。

入力に失敗したときの処理

変数の型と合わない入力(例えばint変数に対して「abc」と入力)があると、cin失敗状態になり、それ以降の入力を受け付けなくなります。失敗したかどうかはcin.fail()、またはcin自体を条件式に置くことで判定できます。

失敗状態から復帰するには、まずcin.clear()でエラーフラグを解除し、続いてcin.ignore()で入力に残っている不正な文字を読み捨てます。

#include <iostream>

#include <limits>

int main() {

    int n;

    std::cout << "整数を入力: ";

    if (!(std::cin >> n)) {   // 入力が整数でなければ true

        std::cout << "整数ではありません" << std::endl;

        std::cin.clear();   // エラーフラグを解除

        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 残りを読み捨て

    } else {

        std::cout << "入力された値: " << n << std::endl;

    }

    return 0;

}

 

cin.ignore()std::numeric_limits<std::streamsize>::max()'\n'を渡すと、「改行が現れるまで(または読み取り上限まで)読み捨てる」という指定になります。std::numeric_limitsを使うには<limits>ヘッダが必要です。

coutとの対応(関連)

std::cinはキーボードからの入力を担い、std::coutは画面への出力を担います。両者は対になっており、演算子も対応しています。

対象 ストリーム 演算子 向き
入力 std::cin 抽出演算子 >> 入力 → 変数
出力 std::cout 挿入演算子 << 値 → 画面

 

演算子の向きを「データが流れる方向」と覚えると分かりやすく、cin >> xはデータがxへ向かい、cout << xはデータがcoutへ向かう、というイメージになります。

よくある落とし穴

注意点 内容
>>の後にgetline cin >>は入力末尾の改行を読み残します。直後にstd::getlineを呼ぶと、その残った改行を空行として読み込んでしまいます。間にstd::cin.ignore()を入れて改行を読み捨ててからgetlineを使います。
型の不一致でfail int変数に「abc」のような文字を入力すると失敗状態になり、以降のcinがすべて素通りします。cin.clear()cin.ignore()で復帰させない限り入力を受け付けません。
数値と文字列の混在 数値を>>で読んだ後に文字列を行単位で読む処理が続く場合、上記の改行残りの問題が起きやすくなります。入力方法を統一するか、改行の読み捨てを忘れないようにします。

 

FAQ

Q. cinstd::cinはどちらを書けばよいですか。
A. どちらも同じものを指します。using namespace std;を書いている場合はcinと省略でき、書いていない場合はstd::cinと書く必要があります。大規模なコードでは名前の衝突を避けるため、std::を付けて書く方が安全とされています。

Q. スペースを含む文字列が途中までしか入力されません。
A. cin >>は空白を区切りとして扱うため、最初の単語までしか読み込みません。スペースを含む1行を読みたい場合はstd::getline(std::cin, 文字列)を使ってください。

Q. getlineを使ったら最初の1回が空になってしまいます。
A. 直前にcin >>で数値などを読み込んでいる場合、入力に残った改行をgetlineが読み取ってしまうことが原因です。cin >>のあとにstd::cin.ignore()で改行を読み捨ててからgetlineを呼んでください。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. printf 標準入出力関数
  2. printfで数値を表示する方法
  3. coutによるコンソール出力
  4. cinによる入力(パラメータ渡し)

最近更新/作成されたページ