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

《C++ Primer》中cin换行处理与循环退出的两类技术问题

解决C++中cin换行处理的两个问题

针对你提出的两个问题——输入数字序列后按回车退出循环、首次直接回车跳过处理流程,最优雅且鲁棒的实现方式是先读取整行输入,再用字符串流解析内容,具体代码如下:

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main() {
    const string hexdigits = "0123456789ABCDEF"; // 十六进制字符集
    cout << "Enter a series of numbers between 0 and 15"
         << " separated by spaces. Hit ENTER when finished: "
         << endl;

    string input_line;
    // 读取整行输入,直到回车结束
    getline(cin, input_line);

    // 处理首次直接回车的情况:输入为空则跳过流程
    if (input_line.empty()) {
        cout << "No input provided." << endl;
        return 0;
    }

    string result;
    string::size_type n;
    istringstream iss(input_line); // 将整行内容转为可解析的字符串流

    // 逐个读取数字并转换为十六进制字符
    while (iss >> n) {
        if (n < hexdigits.size()) {
            result += hexdigits[n];
        }
    }

    cout << "Your hex number is: " << result << endl;
    return 0;
}

方案优势

  • 完美匹配需求:getline会一次性读取到回车为止,自然实现"按回车退出输入"的逻辑;如果首次直接回车,input_line为空,直接跳过后续处理。
  • 鲁棒性更强:自动处理输入开头的空格、制表符等空白字符,不会出现cin.peek()误判的情况;同时兼容输入中混入非数字字符的场景(此时字符串流解析会停止,和原代码行为一致)。
  • 逻辑清晰:将"读取输入"和"解析处理"分离,代码结构更易读、易维护,避免直接操作cin状态带来的复杂逻辑。

对比其他方案的问题

你之前使用cin.peek()的方案存在潜在隐患:如果输入开头是空白字符(比如空格),cin.peek()会先读到空白而非换行,导致循环错误执行;若后续输入空白后直接回车,cin >> n会读取失败,n的值不确定,可能引发hexdigits[n]的越界访问。

如果不想引入字符串流,也可以通过操作cin的空白跳过实现,但代码复杂度更高:

#include <iostream>
#include <string>

using namespace std;

int main() {
    const string hexdigits = "0123456789ABCDEF";
    cout << "Enter a series of numbers between 0 and 15"
         << " separated by spaces. Hit ENTER when finished: "
         << endl;

    string result;
    string::size_type n;

    // 跳过前导空白,检查是否直接回车
    cin >> ws;
    if (cin.peek() == '\n') {
        cout << "No input provided." << endl;
        return 0;
    }

    // 读取数字直到遇到换行
    while (cin >> n) {
        if (n < hexdigits.size()) {
            result += hexdigits[n];
        }
        cin >> ws; // 跳过当前数字后的空白
        if (cin.peek() == '\n') {
            break;
        }
    }

    cout << "Your hex number is: " << result << endl;
    return 0;
}

这个方案需要手动处理空白字符,逻辑不如字符串流直观,仅适合不想引入额外头文件的场景。

内容的提问来源于stack exchange,提问作者Brock_inf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:22:04