微信搜索编程笔记本,获取更多干货知识
现在大部分企业的在线笔试都是采用的 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
在输入整数时,会自动忽略 space
和 enter
。
一个可行的解决方案是:在输入完成时,我们手动地输入一个文件结束符(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$
*/
至此,我们就完成了不定数量的输入数据的读取了。
微信搜索编程笔记本,获取更多干货知识