仅使用<iostream>,如何为C++整数数组实现类似getline()的输入?
解决以Q结尾的数字序列输入与第二小值计算问题
方案一:直接用cin循环读取(推荐)
不用纠结cin.getline()的char数组限制,cin默认会自动跳过空格、换行符等分隔符,直接读取每个输入单元,刚好匹配你的需求。下面是完整实现代码:
#include <iostream> #include <vector> #include <algorithm> #include <limits> using namespace std; int main() { vector<int> nums; string input; cout << "输入整数(输入Q退出):"; while (cin >> input) { // 检测退出指令 if (input == "Q" || input == "q") { break; } // 转换输入为整数,处理无效输入 try { int num = stoi(input); nums.push_back(num); } catch (...) { cout << "输入无效,请输入整数或Q" << endl; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } } // 校验数字数量 if (nums.size() < 2) { cout << "数字数量不足,无法计算第二小值" << endl; return 1; } // 排序后找第二小值(处理重复数字) sort(nums.begin(), nums.end()); int first_min = nums[0]; int second_min = first_min; for (int num : nums) { if (num > first_min) { second_min = num; break; } } cout << "第二小值:" << second_min << endl; return 0; }
关键说明:
cin >> input会自动跳过所有空格,直接获取每个输入项(数字或Q),无需手动拆分字符串- 用
stoi将字符串转为整数,捕获异常处理非数字的无效输入 - 排序后遍历数组,找到第一个大于最小值的数,就是第二小值(兼容重复数字的情况,比如示例中的两个1)
方案二:使用getline读取整行再拆分
如果一定要用cin.getline(),可以结合stringstream来拆分整行内容,避免手动处理char数组:
#include <iostream> #include <vector> #include <algorithm> #include <sstream> using namespace std; int main() { vector<int> nums; string line; cout << "输入整数(输入Q退出):"; getline(cin, line); stringstream ss(line); string token; while (ss >> token) { if (token == "Q" || token == "q") { break; } try { int num = stoi(token); nums.push_back(num); } catch (...) { cout << "输入无效,请输入整数或Q" << endl; return 1; } } if (nums.size() < 2) { cout << "数字数量不足,无法计算第二小值" << endl; return 1; } sort(nums.begin(), nums.end()); int first_min = nums[0]; int second_min = first_min; for (int num : nums) { if (num > first_min) { second_min = num; break; } } cout << "第二小值:" << second_min << endl; return 0; }
关键说明:
getline(cin, line)读取整行输入到string对象,无需char数组stringstream可以像cin一样拆分字符串,自动跳过空格,逐个获取每个输入项- 后续的数字处理、第二小值计算逻辑和方案一完全一致
内容的提问来源于stack exchange,提问作者Phuc Truong
相关产品推荐
相关产品推荐

