读取不定数量的输入数据

微信搜索编程笔记本,获取更多干货知识

现在大部分企业的在线笔试都是采用的 ACM 模式,也就是我们需要自己处理输入输出信息。一种比较难的是不定数量的输入。一般系统给的多个输入数据都是以空格分隔,以换行结束

下面我们就来看一下传统的写法有什么问题:

#include <bits/stdc++.h>

using namespace std;

int main()
{
	int n;
	vector<int> nums;
	
	cout << "Input:" << endl;
	
	while (cin >> n) {
		nums.push_back(n);
	}
	
	cout << "\nOutput:" << endl;
	
	for (auto num : nums) {
		cout << num << " ";
	}
	
	cout << endl;
	
	return 0;
}

/*
编译运行:

jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$ g++ test.cpp
jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$ ./a.out
Input:
1 2 3



^C
jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$
*/

可以看到,我们在将 1 2 3 输入完成后,按 enter 并不能结束输入。原因:cin 在输入整数时,会自动忽略 spaceenter

一个可行的解决方案是:在输入完成时,我们手动地输入一个文件结束符(Ctrl+D),告诉输入流输入结束。

#include <bits/stdc++.h>

using namespace std;

int main()
{
	int n;
	vector<int> nums;
	
	cout << "Input:" << endl;
	
	while (cin >> n) {
		nums.push_back(n);
	}
	
	cout << "\nOutput:" << endl;
	
	for (auto num : nums) {
		cout << num << " ";
	}
	
	cout << endl;
	
	return 0;
}

/*
编译运行:

jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$ ./a.out
Input:
1 2 3     // 此处从键盘键入 Ctrl+D
Output:
1 2 3
jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$
*/

虽然文件结束符是一个可行的方法,但是,在线笔试的输入数据要求以换行为结束符,那该如何处理呢?

一个预备知识:键盘键入的数据都是先存放在输入缓冲区中的,cin 在遇到 enter 的时候,才会去从输入缓冲区中去读取数据。

下面的程序,模拟每输入一个数按一次 enter 键,并直接打印该数。说明:cin 在遇到 enter 的时候,才会去从输入缓冲区中去读取数据。


#include <bits/stdc++.h>

using namespace std;

int main()
{
	int n;
	
	cout << "Input:  ";
	while (cin >> n) {
		cout << "Output: " << n << endl;
		cout << "Input:  ";
	}
	
	return 0;
}

/*
编译运行:

jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$ ./a.out
Input:  1
Output: 1
Input:  2
Output: 2
Input:  3
Output: 3
Input:  ^C
jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$
*/


让我们再来分析一下输入的流程。

微信搜索编程笔记本,获取更多干货知识

在这里插入图片描述

从上图中,我们可以清晰地看出,cin 从缓冲区中逐个取数据并进行拼接,直至遇到空格或换行符,就结束当前数据的获取,并忽略该字符,准备下一次数据的获取。

既然这样,我们可以就可以enter 进行截获并判断,当遇到 \n 时,我们就结束输入。

一个预备知识:getchar() 可以从输入缓冲区中获取一个字符。


#include <bits/stdc++.h>

using namespace std;

int main()
{
	int n;
	vector<int> nums;
	
	cout << "Input:" << endl;
	
	while (cin >> n) {
		nums.push_back(n);

		if (getchar() == '\n') {
			break;
		}
	}
	
	cout << "Output:" << endl;
	
	for (auto num : nums) {
		cout << num << " ";
	}
	
	cout << endl;
	
	return 0;
}

/*
编译运行:

jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$ ./a.out
Input:
1 2 3     // 此处从键盘键入 enter
Output:
1 2 3
jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$
*/

至此,我们就完成了不定数量的输入数据的读取了。

微信搜索编程笔记本,获取更多干货知识

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值