C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のcin.ignore()関数とは?入力バッファをクリアする方法をわかりやすく解説

cin.ignore() は、入力バッファから1つ以上の文字を無視(読み捨て)したり、バッファをクリアしたりするために使われる関数です。

ignore() の動作を理解するには、実際に起こりうる問題とその解決策を見るのが一番早いでしょう。以下に典型例を示します。

入力バッファのクリアが必要な理由

プログラムでは、不要になった入力バッファを事前にクリアしておきたい場面があります。こうすることで、次に入力されたデータが目的の変数へ正しく格納され、以前の変数のバッファに混入することを防げます。

たとえば、cin で整数を読み込んだ直後に、文字配列や文字列を入力したいケースを考えてみます。ここで入力バッファをクリアしないままにすると、前の入力に関連するバッファ内容が残ってしまいます。

1回目の入力の後で「Enter」キーを押すと、改行文字がバッファに残ります。前の変数のバッファには新しいデータを受け入れる余裕があるため、プログラムはその後の入力処理をスキップしてしまうのです。

問題が発生するコード例

#include<iostream>
#include<vector>
using namespace std;
main() {
    int x;
    char str[80];
    cout << "Enter a number and a string:\n";
    cin >> x;
    cin.getline(str,80); //文字列を入力
    cout << "You have entered:\n";
    cout << x << endl;
    cout << str << endl;
}

実行結果

Enter a number and a string:
8
You have entered:
8

整数用と文字列用の2つの入力文があるにもかかわらず、実際に読み込まれるのは数値だけです。「Enter」キーを押した時点で getline() は何も入力を受け取らないままスキップされてしまいます。場合によっては何らかの入力を受け付けても、それが整数変数側のバッファ内に収まってしまうため、文字列が出力に現れないことがあります。

cin.ignore() による解決策

この問題を解決するために cin.ignore() を使います。この関数は、指定した条件に達するまで入力を無視し続けます。具体的には次のように記述します。

cin.ignore(numeric_limits<streamsize>::max(), '\n');

これは「streamsize 型が表現できる最大値(numeric_limits<streamsize>::max())まで入力を無視し、途中で改行文字 '\n' を検出したらそこで停止する」という意味になります。つまり、改行文字も含めてバッファが完全にクリアされます。

なお、この書き方には <ios>(ストリームサイズ関連の定義)と <limits>(数値の上限・下限の取得)という2つのヘッダのインクルードが必要です。

修正後のコード例

#include<iostream>
#include<ios>     //ストリームサイズを取得するために使用
#include<limits>  //数値の上限値を取得するために使用
using namespace std;
main() {
    int x;
    char str[80];
    cout << "Enter a number and a string:\n";
    cin >> x;
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); //新しい行を受け取る前にバッファをクリア
    cin.getline(str,80); //文字列を入力
    cout << "You have entered:\n";
    cout << x << endl;
    cout << str << endl;
}

実行結果

Enter a number and a string:
4
Hello World
You have entered:
4
Hello World

今度は数値と文字列の両方が正しく出力されました。>> 演算子による入力の後に getline() などの行単位の入力を続ける場合は、間に cin.ignore() を挟むことで、バッファへの改行文字の残留によるトラブルを防げます。

補足:サンプルコード中の main() は歴史的な書き方ですが、現代のC++では戻り値型を明示した int main() と記述することが推奨されています。

  1. C++のconstキーワードとは?定数宣言の基本とメリットを解説

    C++におけるconstは、変数を「定数」として宣言するための型修飾子です。const付きで宣言された変数は、一度初期化するとその値を後から変更することができません。 constを使うメリット constを使用する最大の利点は、プログラム内で値が意図せず書き換えられるのを防げることです。例えば、円周率(PI)のような不変の値を扱う場合、プログラムのどの部分からもその値が変更されないようにしたいはずです。このような値はconstとして宣言しておくことで、誤った代入から守ることができます。 コンパイラの最適化との関係 const修飾された型を持つオブジェクトは、コンパイラによって読み取り専用メ

  2. PHPのini_set()関数とは?使い方と設定変更方法を解説

    ini_set()関数とはPHPでは、php.iniで定義された設定項目の一部を、ini_set()関数を使ってスクリプト内から動的に変更することができます。この関数は2つの文字列引数を受け取ります。第1引数には変更したい設定項目の名前を、第2引数には新しく割り当てる値を指定します。パラメータvar_name(設定名)すべての設定項目がini_set()で変更できるわけではありません。変更可能なオプションの一覧は、PHP公式マニュアルの付録に掲載されています。変更しようとした項目がスクリプトレベルでの変更に対応していない場合、設定は反映されないので注意が必要です。newvalue(新しい値)対