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;
}

如果您不理解逻辑,则无需担心,因为我的问题与此无关。

在搜索功能中,有两个 cin.get(),我需要用户输入一个字符。我的问题是程序仅在第二个 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

您的代码中至少存在两个问题。首先是您在输入后将字符留在缓冲区中N。最简单的解决方案是添加对std::cin.ignore( INT_MAX, '\n' ); after的调用std::cin >> N;;一个更好的解决方案(因为它允许更多的错误检查)是使用std::getline读取完整的行,然后使用std::istringstream.

第二个问题是您将结果分配 std::cin.get()char. std::cin.get()返回一个int,可能是EOFEOF 而且你真的想在转换为之前int检查它是否是char:你不能在之后检查,因为要么一些合法的char比较等于EOF(plainchar是有符号的),要么char永远不会比较等于EOF(plainchar 是无符号的)。另一种选择是执行以下操作:

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

每次你想读一个char。(在您的情况下这可能会更好,因为如果您确实 read EOF,所有进一步的调用都std::cin.get() 将返回EOF。)

于 2012-09-17T13:40:37.190 回答