使用Ctrl+Z/Ctrl+D中断cin输入后无法重置cin状态重新进行输入

问题背景

  • 笔者今天想简单写一个程序来获取用户输入,程序伪代码流程是这样的:
while (cin.good()) {
    // 1.0 死循环获得第一部分输入
    // 通过Ctrl + Z/Ctrl + D中断输入
    while (...) {
        cin >> ...省略;
    }
    
    cin.clear(); // 重置cin状态
    cin.ignore(max_size, '\n'); // 清除缓冲区的脏东西,直到遇到换行符

    // 2.0 死循环获得第二部分输入
    // 通过Ctrl + Z/Ctrl + D中断输入
    while(...) {
        cin >> ...省略;
    }

    cin.clear(); // 重置cin状态
    cin.ignore(max_size, '\n'); // 清除缓冲区的脏东西,直到遇到换行符

    ...省略;
    // 开始新的一轮输入
}
  • 程序实际跑起来后,会先进入”// 1.0 死循环获得第一部分输入“, 但是按下Ctrl + Z/Ctrl + D后,程序不会进入// 2.0 死循环获得第二部分输入,最外层的大循环直接退出了,百思不得其解。

问题定位

网上搜了一下,原来是用户输入Ctrl+Z/Ctrl+D后,Ctrl+Z/Ctrl+D不会发送到cin的缓冲区中处理,整个输入就终止了,如果想重新输入,需要调用clear(stdin)来恢复输入流。详情看这里

问题解决

  • 使用Ctrl+Z/Ctrl+D中断cin输入后, 如果想重置cin状态再次进行输入可以用如下3行代码。WIndows和Linux下均有效。
        cin.clear();
        clearerr(stdin);
        cin.ignore(max_size, '\n');// constexpr auto max_size = numeric_limits<std::streamsize>::max();
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容