1. ホーム
  2. c++

[解決済み] C++:cinバッファが空かどうかを確認するにはどうすればよいですか?

2022-02-12 05:28:09

質問内容

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

どのように解決するのですか?

から読み込む場合 std::cin を使用しないことが望ましい。 ストリーム抽出演算子 >> というのも、これはいろいろと厄介な副作用があるからです。 例えば、こんなコードがあったとします。

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

と入力します。 John Doe から読み込む行は cin は、単に値を保持するだけです。 John を残して Doe が残っていて、将来の読み取り操作で読み取れるようになっています。 同様に、もし私が書くとしたら

int myInteger;
std::cin >> myInteger;

そして、私は次のように入力します。 John Doe そして cin はエラー状態になり、明示的にエラー状態を解除し、エラーの原因となった文字をフラッシュするまで、以降の読み込み操作を拒否します。

ユーザー入力を行うためのより良い方法として std::getline を使い、ユーザーがエンターキーを押すまでキーボードから文字を読み取ります。 例えば

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

ADL は、argument-dependent lookupの略です。さて、もし私が John Doe の値は name は次のようになります。 John Doe にデータが残らなくなります。 cin . さらに、これによって、ユーザーがエンターキーを押したかどうかをテストすることもできます。

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

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

この方法の欠点は、フォーマットされたデータ行を読み込む場合、そのデータ行にある int または double の場合、文字列から表現をパースする必要があります。 個人的には、ユーザーが無効なものを入力した場合にどうするかをより細かく制御できるようになり、"guard"する価値があると思います。 cin フェイルステートにならないようにするためです。

私はC++プログラミングの講義を担当していますが、その際に streams ライブラリに関する講義ノート からフォーマットされたデータを読み取る方法について、かなり詳細に説明しています。 cin を安全な方法で書いています(主にこの章の終わり)。 これがどれだけ役に立つかは分かりませんが、万が一役に立つのであればリンクを貼っておこうと思います。

お役に立てれば幸いです。