我写了以下代码:
#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
为什么会这样做?
答案 0 :(得分:2)
您的代码中至少存在两个问题。首先是你
输入N
后将字符留在缓冲区中。最简单的
解决方案是只添加对std::cin.ignore( INT_MAX, '\n' );
的调用
在std::cin >> N;
之后;一个更好的解决方案(因为它允许更多
错误检查)是使用std::getline
来读取完整的
行,然后使用std::istringstream
解析它。
第二个问题是你要分配结果
std::cin.get()
成char
。 std::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
。)