一道尴尬的笔试题- 多行数据输入

本文详细阐述了在ACM竞赛中遇到的数据输入问题,介绍了如何通过Ctrl+Z结束多行输入,并提供了使用getline和istringstream处理整数和字符串的解决方案,以及求解数组中和小于指定数的组合数的方法。
摘要由CSDN通过智能技术生成

项目场景:

网易秋招笔试第一题,自己本地调试的时候卡在了数据输入,实尬。。。


问题描述:

【ACM模式】求数组中两个数之和小于指定数的两数组合数。
输入两行数据,第一行是数组,第二行是目标数M,输出组合数目。
示例:

输入:
-1 -1 7
9
输出:
3
解析: [-1,-1],[-1,7],[-1,7] 的和都小于9

int main(){
	vector<int> input;
	int a;
	while (cin >> a) {
		cout << a << endl;
		input.push_back(a);
	}

	int M = input[input.size() - 1];
...
}

在这里插入图片描述
输入两行数据,然后呢?然后怎么结束呢?回车不能结束读取吗?【懵逼了】


解决方案:

控制台输入时以 Ctrl+Z(Windows) or Ctrl + D(Linux) 结束输入

在这里也记录一下后来学到的控制台多行数据输入方法吧 原出处

1. 多行整数输入:通过getline()istringstream实现

#include <iostream>
#include <string>
# include <vector>
#include <sstream>
using namespace std;
int main()
{
	vector<vector<int> > nums; //二维数组保存多行数
	string str; //接收带空格的字符串
	int num; //读入的数
	// 输入多行整数
	while (getline(cin, str))
	{
		istringstream iss(str);//从str中读入字符

		vector<int> v; //一维数组存一行数
		while (iss >> num)
		{
			v.push_back(num);
		}
		nums.push_back(v);
	}

	// 输出验证
	for (int i = 0; i < nums.size(); ++i)
	{
		for (int j = 0; j < nums[i].size(); ++j)
		{
			cout << nums[i][j] << " ";
		}
		cout << endl;
	}
}

测试效果:
在这里插入图片描述

  1. 多行字符串输入
#include <iostream>
#include <string>
# include <vector>
#include <sstream>
using namespace std;
int main()
{
	vector<vector<string> >strs;
	string strline;
	string str;
	// 输入:逐行读取,解析
	while (getline(cin, strline))   // 读入一行
	{
		if (strline.size() == 0) break;
		// 解析一行
		istringstream iss(strline);
		vector<string> v;
		while (iss >> str)
		{
			v.push_back(str);
		}
		strs.push_back(v);
		v.clear();
	}
	// 输出验证
	for (int i = 0; i < strs.size(); ++i)
	{
		for (int j = 0; j < strs[i].size(); ++j)
		{
			cout << strs[i][j] << " ";
		}
		cout << endl;
	}
}

测试效果
在这里插入图片描述

其他注意:

Ctrl+Z(Windows) or Ctrl + D(Linux)结束输入表示的是结束当前程序的输入,不会在当前程序中再开启一次输入

#include <iostream>
#include <string>
# include <vector>
#include <sstream>
using namespace std;
int main()
{
	vector<vector<string> >strs;
	string strline;
	string str;
	// 输入:逐行读取,解析
	while (getline(cin, strline))   // 读入一行
	{
		if (strline.size() == 0) break;
		// 解析一行
		istringstream iss(strline);
		vector<string> v;
		while (iss >> str)
		{
			v.push_back(str);
		}
		strs.push_back(v);
		v.clear();
	}
	// 再次输入
	string newstr;
	getline(cin,newstr);

	// 输出验证
	for (int i = 0; i < strs.size(); ++i)
	{
		for (int j = 0; j < strs[i].size(); ++j)
		{
			cout << strs[i][j] << " ";
		}
		cout << endl;
	}
	cout << newstr << endl;
}

测试效果:只能实现一次输入,Ctrl+Z后没有提供下一次输入的入口
在这里插入图片描述

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
	vector<int> input;
	int a;
	while (cin >> a) {
		input.push_back(a);
	}

	int M = -1;
	cin >> M;

	// 输出验证
	for (auto v : input) {
		cout << v << " ";
	}
	cout << endl << M << endl;
}

测试效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值