博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读取不定数量的输入数据
阅读量:3925 次
发布时间:2019-05-23

本文共 2373 字,大约阅读时间需要 7 分钟。

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

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

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

#include 
using namespace std;int main(){
int n; vector
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.cppjincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$ ./a.outInput:1 2 3^Cjincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$*/

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

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

#include 
using namespace std;int main(){
int n; vector
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.outInput:1 2 3 // 此处从键盘键入 Ctrl+DOutput:1 2 3jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$*/

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

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

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

#include 
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.outInput: 1Output: 1Input: 2Output: 2Input: 3Output: 3Input: ^Cjincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$*/

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

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

在这里插入图片描述

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

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

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

#include 
using namespace std;int main(){
int n; vector
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.outInput:1 2 3 // 此处从键盘键入 enterOutput:1 2 3jincheng@DESKTOP-42T69DJ:/mnt/e/LinuxSubSysFile$*/

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

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

转载地址:http://whkgn.baihongyu.com/

你可能感兴趣的文章
windows 使用GetLocalTime 和GetSystemTime 所获得的时间不同
查看>>
Android进阶2之图片缩略图(解决大图片溢出问题)
查看>>
Android学习笔记进阶19之给图片加边框
查看>>
Android学习笔记进阶18之画图并保存图片到本地
查看>>
Android学习笔记进阶20之得到图片的缩略图
查看>>
Html制作漂亮表格
查看>>
android图片特效处理之怀旧效果
查看>>
android图片特效处理之锐化效果
查看>>
android图片特效处理之光晕效果
查看>>
JSP之JDBC操作Sql Server数据库
查看>>
Android学习笔记之RadioButton RadioGroup
查看>>
Android学习笔记进阶15之Shader渲染
查看>>
Java学习笔记之FreeTTS(语音)
查看>>
Android 给图片加边框
查看>>
获取JDBC中的ResultSet的记录的条数
查看>>
android图像处理(3)底片效果
查看>>
android图像处理(3)浮雕效果
查看>>
ExtJs 表格的实现
查看>>
题目1085 拦截导弹
查看>>
Kafka 为什么使用kafka
查看>>