为什么c++的cin>>没有执行呢?

在写二分查找时,用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;
}
阅读 1.8k
1 个回答
    vector<int> iv;
    //向容器写入数据
    int i;
    while (cin >> i)
    {
        iv.push_back(i);
    }

看上去,这个while循环并没有显式的退出判断。你是通过什么办法退出这个while循环的呢?

注:可以用Ctrl+D退出此循环

linux下使用CTRL+Z会让前台进程进入睡眠状态


在循环开头和结尾加入了cout语句,用来看看到底是卡在了哪一个循环里面

image.png

可以看到,使用CTRL+D能成功退出第一个循环,但是第二个循环并没有办法用CTRL+D退出。所以你的程序大概率是卡在了第二个循环内部了。

正确的写法应该是判断是否为EOF,如下:

    char c;
    while ((c = getchar()) != EOF)
    {
        ;
    }

但是这样,的确出现了题主所说的语句被跳过的问题!

image.png

如果在循环后打印c和dest的值,会发现c的值是一个乱码,dest的值是0

image.png

我尝试使用了cin.ignore和cin.clear,都无法解决这个问题。如果使用cin.fail进行判断,则会死循环打印输入错误

目前没有想到很好的解决方案,这种情况是cin种的标志位被设置成错误而无法接受后续输入。

  • 可以考虑在第一个while循环中添加一个标志数判断来退出循环。而不使用ctrl+d或者ctrl+c
  • 或者使用scanf的方式来接收int输入
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏