cin.get()无法正常运行

时间:2012-09-17 13:12:39

标签: c++ input blocking cin

  

可能重复:
  Program not waiting for 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

为什么会这样做?

1 个答案:

答案 0 :(得分:2)

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

第二个问题是你要分配结果 std::cin.get()charstd::cin.get()返回int, 可能是EOF。你真的想检查它是否是EOF 在将int转换为char之前:您之后无法检查,因为 某些合法char将比较等于EOF(普通char是 签名),或char永远不会比较等于EOF(普通char 是未签名的)。另一种选择是做类似的事情:

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

每次您想要阅读char。 (这可能会更好 如果你看了EOF,那么所有进一步的电话都会std::cin.get() 将返回EOF。)