2

このループは、ネストされた If と do while を使用していくつかの方法で書き直しましたが、動作は同じです。ユーザーが文字または文字列を入力しない限り、期待どおりに動作します。ユーザーが実行すると、CTRL + C を押すまでループが回転し続けます。

私が調査したところ、変数が数値で、ユーザーが文字または文字列を入力すると、ASCII 数値に変換されるだけで、その場合は while チェックが機能するはずです。数値は許可されているより大きくなければならず、ユーザーは新しい値を求められるべきですか? 無限にループし続けるのはなぜですか?

幅は float として宣言されます。

void setWidth ()
{
    std::cout << "\nPlease enter the width (use numbers greater than 0 and no greater than 20.0).\n";
    std::cin >> width;
    while (width <= 0 || width > 20)
    {
        std::cin.clear();
        std::cin.ignore();
        std::cout << "You have entered a number outside of the allowed range.\nPlease enter a number greater than 0 and no greater than 20.\n";
        std::cin >> width;
    }
}

私が言ったように、数値については、二重、負、何でもうまく機能します。しかし、「asdf」や「a」のようなものは、無限に回転するループに陥ります。

私はすべてを試したようです。なぜこれが起こるのですか?ループする理由はわかっていますが、それは数値が 0 から 20 の間ではないためですが、ユーザーに入力を求めないのはなぜですか? バッファをクリアします。

4

5 に答える 5

4

std::cin >> width;入力が数値ではないため、行は失敗します。また、入力を消費しないため、無限ループに陥ります。

これを回避するには、 を使用して入力を読み取りstd::getline()、それを変換して (std::ostringstreamオプションの 1 つです)、それに応じてエラーを処理および報告する必要があります。

于 2012-11-04T10:09:18.677 に答える
3

のデフォルトでcin.ignore()は、1 文字だけを無視します。

より長い文字列を無視したい場合は、そのための追加のパラメーターを追加する必要があります。おそらく、cin.ignore(1000, '\n')最大 1000 文字または次の改行 (いずれか早い方) をスキップします。

于 2012-11-04T10:18:31.167 に答える
1

cin :: clear()"エラー制御状態の新しい値を設定します" 1が、残りの入力はまだここにあり、読み取られます。

次に、実際の動作はコンパイラに依存すると思います。g++ 4.6.3でコンパイルして入力「abc」を入力すると、ループは3回だけで、別の入力を待つためです。

cinバッファーを空にするには、cinバッファーをフラッシュするにはどうすればよいですか?

于 2012-11-04T10:31:12.833 に答える
0

cinのfailbitをチェックしてみてください

于 2012-11-04T10:11:58.817 に答える
0

わかりました、助けてくれてありがとう... clearBuffer() 関数を作成したことを除いて、私が行っていたことを正確に行うことで、最終的にcin (getlineではなく)で動作させることができました。そのため、getWidth 関数内からバッファをクリアする代わりに、getWidth 関数は別の関数を呼び出します。それにより、getWidth 関数はいくつかのコードを実行するために残されます...その後、残りの部分を実行するために戻ってきます...

何らかの理由で関数の外に出ると正常に動作し、文字列と文字がエラーを引き起こします..しかし、cin.clearとcin.ignoreが関数内に保持されている場合、私はその問題を抱えています.

したがって、最終的なコードは次のようになります。

void clearBuffer()
{
    std::cin.clear();
    std::cin.ignore(80, '\n'); //Ignore the first 80 characters up to an Enter character.
}

void setWidth ()
{
    std::cout << "\n\t\tPlease enter the width.\n(use numbers greater than 0 and no greater than 20.0).\n";
    float temp = NULL; //Using temp here so that we dont write invalid characters to an actual variable.
    std::cin >> temp;
    clearBuffer();
    while (temp <= 0 || temp > 20)
    {
        std::cout << "\nERROR: You have entered width outside of the allowed range.\nPlease enter a number greater than 0 and no greater than 20.\n";
        std::cin >> temp;
        clearBuffer();
    }
    if(temp > 0 && temp <= 20)
        width=temp;
}
于 2012-11-05T03:57:24.760 に答える