web-dev-qa-db-ja.com

C ++:cinバッファーが空かどうかを確認するにはどうすればよいですか?

ユーザーがcinコマンドで何も入力せず、単にEnterキーを押したかどうかを確認するにはどうすればよいですか?

30
Matt Shindala

std :: cin から読み取る場合、 ストリーム抽出演算子>>を使用しないことをお勧めします。これにより、あらゆる種類の厄介な副作用が発生する可能性があります。たとえば、次のコードがある場合:

std::string name;
std::cin >> name;

John Doeと入力すると、cinから読み取る行に値Johnが保持され、将来の読み取り操作でDoeが読み取られるようになります。同様に、私が書く場合:

int myInteger;
std::cin >> myInteger;

そして、John Doeと入力すると、cinはエラー状態になり、エラー状態を明示的にクリアしてエラーの原因となった文字をフラッシュするまで、今後の読み取り操作を拒否します。

ユーザー入力を行うより良い方法は、 std :: getline を使用して、ユーザーがEnterキーを押すまでキーボードから文字を読み取ることです。例えば:

std::string name;
getline(std::cin, name); // getline doesn't need the std:: prefix here because C++ has ADL.

[〜#〜] adl [〜#〜] は、引数依存のルックアップを表します。ここで、John Doeと入力すると、nameの値はJohn Doeになり、cinにはデータが残りません。さらに、これにより、ユーザーがEnterキーを押しただけかどうかもテストできます。

std::string name;
getline(std::cin, name);

if (name.empty()) {
    /* ... nothing entered ... */
}

このアプローチを使用することの欠点は、フォーマットされたデータ行、intまたはdoubleを読み取る場合、文字列から表現を解析する必要があることです。ユーザーが何か無効なものを入力してcinが失敗状態にならないようにする場合の対処方法をよりきめ細かく制御できるので、これは価値があると個人的に思います。

私はC++プログラミングコースを教えており、 ストリームライブラリに関するいくつかの講義ノート は、cinからフォーマットされたデータを安全な方法で読み取る方法についてかなり詳細に説明しています(主に章の終わりに)。これがどれほど役立つかはわかりませんが、役に立つ場合はリンクを投稿すると思いました。

お役に立てれば!

43
templatetypedef

ユーザーが少なくとも1文字を入力しない限り、cinはプログラムを続行しません(enterはカウントしません)。ユーザーが何も入力しなかった場合、cinはユーザーが入力するのを待ち続け、Enterキーを押します。

3
matzahboy