按下Ctrl+D后程序陷入无限循环,如何修复输入缓冲区问题?
问题修复方案
你的代码陷入无限循环的核心问题是错误依赖cin.eof()作为循环终止条件,同时存在语法错误和逻辑流程问题,以下是修复后的代码及说明:
修复后的代码
#include <iostream> #include <limits> using namespace std; // 假设MIN_INDEX为0,MAX_SIZE对应指数范围0-20 const int MIN_INDEX = 0; const int MAX_SIZE = 21; void readCoefficients(int p[]) { int coefficient, exponent; bool success = true; // 修复语法错误:添加分号 // 将读取操作放到循环条件中,先尝试读取再判断有效性 while (cin >> coefficient >> exponent && success) { if ((MIN_INDEX <= exponent) && (exponent <= MAX_SIZE - 1)) { p[exponent] = coefficient; } else { cout << "Error - invalid exponent (Must be between 0 and 20 inclusively)" << endl << "Please try again..." << endl << endl; success = false; // 清理cin错误状态,避免后续读取持续失败 cin.clear(); // 跳过当前行剩余的错误输入 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } } // 处理EOF触发的终止(比如按下Ctrl+D) if (cin.eof()) { cout << "输入已终止,数组加载完成" << endl; } }
关键修改点
- 修复语法错误:给
success = true添加分号,避免编译报错。 - 调整循环逻辑:把
cin >> coefficient >> exponent移到循环条件中,只有读取成功时才进入循环体。按下Ctrl+D触发EOF时,读取操作直接失败,循环会立即终止,不会陷入无限循环。 - 错误状态处理:输入无效指数时,除了设置
success = false,还要用cin.clear()清理错误状态,并用cin.ignore()跳过当前行的错误输入,防止后续读取一直失败。 - 简化冗余判断:原代码中
else if的条件和else完全等价,直接用else简化逻辑即可。
原代码的问题在于:按下Ctrl+D后cin.eof()被触发,但循环条件里的success仍为true,会继续执行循环体,再次执行读取操作时已经EOF,但循环条件的判断逻辑会导致循环持续执行,最终陷入死循环。调整读取位置后,EOF时读取失败,循环直接退出,彻底解决了这个问题。
内容的提问来源于stack exchange,提问作者Khanh Lệ
相关产品推荐
相关产品推荐

