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

C++如何持续读取成对整数输入直到遇到单个整数?

问题原因

你之前的写法失效的核心原因是:C++的cin >>读取整数时,会自动跳过所有空白字符(包括空格、制表符、换行符),完全不区分两个数是不是在同一行。所以当读到单独占一行的3时,cin不会停下,会继续把下一行的1读进来凑成一对(a=3, b=1),自然没法识别到单行的分界点。

解决方案

不要直接跨行读取整数,改为逐行读取输入内容,针对每一行单独判断包含的整数数量,再执行对应逻辑,就可以准确识别单行的分界符。

实现步骤

  • 每次调用getline()读取一整行的完整文本,避免跨行读取
  • 为每一行文本创建独立的字符串流istringstream,仅在当前行范围内解析整数
  • 先尝试解析行内第一个整数,再尝试解析第二个整数:
    • 如果能解析到两个整数:说明当前行是成对输入,在未触发分界逻辑前,将这对数存入第一个数组
    • 如果只能解析到一个整数:判断这个数是不是分界值3,如果是就切换存储模式,后续所有输入都存入第二个数组;如果不是,就按当前存储模式存入对应数组

可运行代码示例

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <utility>

using namespace std;

int main() {
    vector<pair<int, int>> first_arr; // 存成对整数的第一个数组
    vector<int> second_arr; // 存后续单个整数的第二个数组
    bool is_switched = false; // 分界标记,初始为未切换模式
    string line;

    while (getline(cin, line)) {
        istringstream line_stream(line);
        int a, b;
        // 行内没有有效整数,直接跳过
        if (!(line_stream >> a)) {
            continue;
        }
        // 尝试读取第二个整数
        if (line_stream >> b) {
            // 未切换模式时,成对数据存入第一个数组
            if (!is_switched) {
                first_arr.emplace_back(a, b);
            }
        } else {
            // 行内只有单个整数
            if (!is_switched && a == 3) {
                is_switched = true;
                // 如果题目要求分界符3本身也存入第二个数组,放开下面这行注释即可
                // second_arr.push_back(a);
            } else {
                second_arr.push_back(a);
            }
        }
    }

    // 后续写你的业务处理逻辑即可
    return 0;
}

注意点

如果你的代码之前混用了cin >>和getline,需要先处理输入流里残留的换行符,否则第一次getline会读到空行。上面的示例全程用getline逐行读取,不存在这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:45:50