0

重複の可能性:
プログラムがcinを待機していない

私は次のコードを書きました:

#include <iostream>
using namespace std;

void search(int pre, int a, int b, int x) {
    char c;
    cout << "Is the number " << ((x == 2) ? b : a) << endl;
    c = cin.get(); ////// this does not block
    if (c == 'y') return;

    else {
        cout << "Is the number " << ((x == 2) ? b : a) << " closer to your number than " << pre;
        c = cin.get();

        if (c == 'y') {
            search(a, a, (a + b) / 2, 2);
        } //c=='y'
        else search(a, (a + b) / 2, b, 1);
    }
}

int main() {
    int N;
    cout << "Enter N? ";
    cin >> N;

    search(N, 1, N, 1);
    return 0;
}

私の質問はそれに関するものではないので、論理を理解していなくても心配する必要はありません。

検索関数には、2つのcin.get()があり、ユーザーが文字を入力する必要があります。私の問題は、プログラムが2番目のcin.get()の後でのみ入力をブロックすることです。

例えば:

 Is the number 7  //program doesn't wait after this
 Is the number 7 closer to your number than 8  //program blocks here for an input

なぜそうするのですか?

4

1 に答える 1

2

コードには少なくとも2つの問題があります。1つ目は、入力後に文字をバッファに残すことですNstd::cin.ignore( INT_MAX, '\n' ); 最も簡単な解決策は、 afterに呼び出しを追加することstd::cin >> N;です。より良い解決策(より多くのエラーチェックが可能になるため)は、を使用std::getlineして行全体を読み取り、を使用して解析することstd::istringstreamです。

std::cin.get()2番目の問題は、の結果をに割り当てていることです charstd::cin.get()を返します。これは。intである可能性がありますEOF。そして、あなたは本当にそれがEOF に変換する前intであるかどうかをチェックしたいですchar:いくつかの合法的なものcharが等しいと比較されるEOF(プレーンcharが署名されている)か、またはchar決して等しく比較されないEOF(プレーンchar は署名されていない)ため、後でチェックすることはできません。もう1つの方法は、次のようなことを行うことです。

if ( !std::cin.get( c ) ) {
    //  EOF or error seen...
}

読みたいたびにchar。(これは、あなたが読んだ場合、それ以降EOFのすべての呼び出しstd::cin.get() が返されるため、あなたの場合はより良いかもしれませんEOF。)

于 2012-09-17T13:40:37.190 に答える