3

与えられた入力が有効であることを確認するために、Bjarne Stroustrup による Programming: Principles and Practice in C++ からこのコードを採用しました。

#include <iostream>
using namespace std;

int main()
{
    cout << "Please enter your first name and age: ";
    string first_name = "???";
    int age = -1;
    cin >> first_name >> age;

    while (!cin) {
        cin.clear();
        cout << "Sorry, can you enter that again? ";
        cin >> first_name >> age;
    }

    cout << "Hello, "<<first_name<<"! (age "<<age<<")\n";
    return 0;
}  

"Sorry, can you enter that again? "これは、2 番目の入力の前と後に 1 回、2 回単語が出力されることを除いて、期待どおりに機能します。

なぜこれが起こっているのか誰にも分かりますか?ありがとう。

4

2 に答える 2

3

フェイルビットをクリアするだけでは不十分です。入力バッファに残っている文字もすべてクリアする必要があります。さらに、コードは必要以上に複雑に見えます。次の作品:

std::string name;
int age;

std::cout << "Please enter your name & age: ";

while (not (std::cin >> name >> age)) {
    std::cout << "Sorry, can you enter that again? ";
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

std::cout << "Hello " << name << " (" << age << ")\n";

そうそう、出力ストリームをフラッシュすることを忘れないでください。これが自動的に行われるとは思いません。

とは言うものの、標準の入出力ストリームは、まあ、ストリームであるため、とにかくインタラクティブな入力にはあまり適していません。readlineそのためには、またはなどの適切なライブラリを使用する必要がありますncurses

これが重要である理由を説明するために、ユーザーが「<code>foo42」と入力してReturnキーを押すと想像してください。プログラムが「申し訳ありませんが、もう一度入力できますか?」と表示されることを期待します。しかし、そうではありません。むしろ、ユーザーが2番目のトークンを入力するのを従順に待ちます。それは確かに、ユーザビリティの観点から期待するものではありません。

于 2012-09-14T10:16:39.197 に答える
1

入力内容によって異なります。

  • 入力"Tim 29":作品、「こんにちはティム(29)」。

  • 入力"Tim Tom 29":作品、1回の繰り返し、「HelloTom(29)」。

  • 入力"Tim Tom Tina 29":作品、2回の繰り返し、「HelloTina(29)」。

私はあなたが3番目のものを試していると仮定しています。最初の失敗はTom、数ではないです。エラー状態をリセットすることは問題ありませんが、それは取り除かれませんTom。彼を食い尽くすためだけにもう1回失敗する必要があります(失敗するTinaと、その時点では数ではありません)。そうして初めて、準備が整いTinaます。

于 2012-09-14T10:11:50.250 に答える