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
相关产品推荐
相关产品推荐

