2009-03-10 15 views
5

std::cinを使用するプログラムを書くたびに、ユーザーがプログラムを終了するためにEnterキーを押したければ、希望の動作を得るためにstd::cin.ignore()を2回書かなければならないことに気付きました。たとえば:2番目のcin.ignore()が必要なのはなぜですか?

#include <iostream> 

int main(void) 
{ 
    int val = 0; 
    std::cout << "Enter an integer: "; 
    std::cin >> val; 

    std::cout << "Please press Enter to continue..." << std::endl; 

    std::cin.ignore(); 
    std::cin.ignore(); // Why is this one needed? 
} 

私も、私は最後に実際の入力のためではなく、単にignore()コールのためにcinを使用していないときに気づいた、私は一つだけを必要としています。

+0

LinuxまたはWindowsを実行している、それが理由であってもよいですWindowsを実行している場合のCRLFの問題... – Ben

+0

同じ問題がSolaris上で発生します。それはCRLFとは関係ありません。 –

答えて

8

Discl:実際に起こっていることを単純化しています。

最初の演算子は、抽出演算子(>>)が消費しなかったものをパージします。 もう1つは\ nを待っています。

我々はSTDを行うときには、まったく同じです::抽出後のgetline:the_stream::ignore(std::numeric_limits<streamsize>::max(), '\n');ははstdの呼び出し前に必要です:: getlineの()

+3

ああ、私は参照してください。したがって、最初のプロンプトで入力する文字が "123 \ n"であれば、演算子>>()は "\ n"だけを残し、第1のignore()はそれを読み取ります。 2番目のignore()はキーを押すのを待ち、それを読み込みます(2番目の "\ n")。 +1。 –

+0

それは考えです。 –

0

これは奇妙です。どのプラットフォームを実行していますか?定義によって、ignoreは、入力ストリームからn文字を抽出して破棄します。または、EOFをヒットした場合は停止します。パラメータを指定しないと、1文字が抽出されます。 Windowsでは、行の末尾には\r\nの両方が含まれます(合計2文字(改行後に改行が続きます)。

+0

私は、最初はそれも考えましたが、ライブラリは、プラットフォームが使用する行終了スキームを抽象化することになっていて、アプリケーションコードは "\ n"しか表示しません。 –

関連する問題