问题背景
- 笔者今天想简单写一个程序来获取用户输入,程序伪代码流程是这样的:
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();