本文共 2373 字,大约阅读时间需要 7 分钟。
微信搜索编程笔记本,获取更多干货知识
现在大部分企业的在线笔试都是采用的 ACM 模式,也就是我们需要自己处理输入输出信息。一种比较难的是不定数量的输入。一般系统给的多个输入数据都是以空格分隔,以换行结束。
下面我们就来看一下传统的写法有什么问题:
#includeusing 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
在输入整数时,会自动忽略 space
和 enter
。
一个可行的解决方案是:在输入完成时,我们手动地输入一个文件结束符(Ctrl+D),告诉输入流输入结束。
#includeusing 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
的时候,才会去从输入缓冲区中去读取数据。
#includeusing 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()
可以从输入缓冲区中获取一个字符。
#includeusing 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/