1. ホーム
  2. c++

[解決済み] cin.ignore()は具体的に何をするのですか?

2022-02-01 18:27:06

質問

教授に言われたのですが、毎回 cin のように、必ずその後に cin.ignore(100, '\n') . でも、なぜなんだろう?

ここで一例をご紹介します。

const int MAX = 200;
char input[MAX];

cout << "Enter something: ";
    cin.get(input, MAX);
    cin.ignore(100, '\n'); //why necessary?!!

解決方法は?

を使用する必要はありません。 ignore あらゆる のような、ある特定の時間だけしか読まないような場合、あるいはフォーマットされた入力の後に使用するとよいでしょう。

あなたの例では、もし私が200文字以上入力したら、今後の入力は手荒いものになるかもしれませんね。

char input[200];
std::cin.get(input, 200);

この実行後、最初の200文字が抽出されましたが、それ以降の文字はストリームに眠ったままになっています。また、改行( '\n' ) 文字が含まれています。これ以降に入力を取り出そうとすると、いつでも前回の入力から残りの文字を読み込むことになります。

これは、フォーマットされた入力でも起こります。この例を見てみましょう。

int age;
std::string name;
std::cin >> age;
std::getline(std::cin, name);

あなたが欲しいのは、年齢を入力することです、例えば 32 というような名前と、quot;Bob" というような名前を指定します。年齢を入力すると、プログラムは名前を読むのをスキップします。このとき std::cin>> を変数に読み込むために '\n' という文字は、エンターキーを押してストリームに入れられたものです。すると getline はその改行文字を読み込んで停止します。なぜなら、改行文字に当たったので、それが終わったと思ったからです。

ignore はこの問題を解決するために、次の改行文字を含むまでのすべてを破棄し、余分な入力が将来の読み込みを混乱させないようにします。

std::cin.ignore(std::numeric_limits<std::streamsize>::max());