You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按下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ệ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:48:27