在写二分查找时,用while循环向容器添加数据后再输入想要查找的值,但是那句输入语句(如下:)
int dest = 0;
cout << "请输入目标:" << endl;
//这句输入代码被跳过了
cin >> dest;
好像没有执行。我以为是没有清空输入缓冲区的换行符的原因,但是清空之后依然没有执行输入语句。但是只要把利用while循环向容器写入数据注释掉就会执行。为什么呀?
#include <vector>
#include <iostream>
#include <algorithm>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
int main()
{
vector<int> iv;
//向容器写入数据
int i;
while (cin >> i)
{
iv.push_back(i);
}
//排成升序
sort(iv.begin(), iv.end());
//清空输入缓冲区
char c;
while ((c = getchar()) != '\n')
{
;
}
int dest = 0;
cout << "请输入目标:" << endl;
//这句输入代码被跳过了
cin >> dest;
//二分查找
auto beg = iv.begin(), end = iv.end(), mid = (end - beg) / 2 + beg;
while (mid != end && *mid != dest)
{
if (*mid < dest)
{
beg = mid + 1;
}
else
{
end = mid;
}
mid = (end - beg) / 2 + beg;
}
if (mid == end)
{
cout << dest << "不在容器中" << endl;
}
else
{
cout << dest << "在" << endl;
}
return 0;
}
看上去,这个while循环并没有显式的退出判断。你是通过什么办法退出这个while循环的呢?
在循环开头和结尾加入了cout语句,用来看看到底是卡在了哪一个循环里面
可以看到,使用CTRL+D能成功退出第一个循环,但是第二个循环并没有办法用CTRL+D退出。所以你的程序大概率是卡在了第二个循环内部了。
正确的写法应该是判断是否为EOF,如下:
但是这样,的确出现了题主所说的语句被跳过的问题!
如果在循环后打印c和dest的值,会发现c的值是一个乱码,dest的值是0
我尝试使用了cin.ignore和cin.clear,都无法解决这个问题。如果使用cin.fail进行判断,则会死循环打印
输入错误
目前没有想到很好的解决方案,这种情况是cin种的标志位被设置成错误而无法接受后续输入。