【问题标题】:cin.get() not functioning as desired [duplicate]cin.get() 没有按预期运行[重复]
【发布时间】:2012-09-17 13:12:39
【问题描述】:

可能重复:
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

为什么会这样?

【问题讨论】:

  • 问题出在您没有显示的代码中。编写一个调用这个函数的简单程序。它会工作得很好。然后开始改变那个简单的程序,添加你当前程序现在所做的事情,直到问题再次出现。然后想想你改变了什么。
  • 这是一个常见的“问题”,在本站搜索“cin get flush”...
  • 问题是在 main 中的 cin &gt;&gt; 之后缺少一些东西。尝试调用该函数两次,第一个 get 第二次应该可以正常工作。
  • @chris 还是不行。他必须准确定义在std::cin &gt;&gt; N 之后应该提取的内容。

标签: c++ input blocking cin


【解决方案1】:

您的代码中至少存在两个问题。第一个是你是 输入N 后将字符留在缓冲区中。最简单的 解决方案是添加对std::cin.ignore( INT_MAX, '\n' ); 的调用 在std::cin &gt;&gt; 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。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多