之前一直在leetcode上刷题,核心代码模式用的过于舒适,
笔试前听说是ACM模式,就临时准备了下ACM模式的常用IO方法。
其实常用的不多,本着奥卡姆剃刀原则只写了两个常用的IO方法,足够应付大多数笔试(美团笔试中没有翻车):
1. cin>>x :
- 自动跳过 tab/space/enter 取数据;
- 从缓冲区读数据到变量x,而不是从键盘输入读取。(读数据前清空缓冲区: cin.sync();)
用法解析
- 输入一个数字或字符
- 接收一个字符串(到char数组或string),遇 tab/space/enter 结束,但是并不会吃掉 遇到的 空格/换行符,该空格/换行符还会参与下一次的读取。
2. getline(cin, x)
- 需要 #include < string> 头文件;
- 可以读入 SPACE/TAB,遇到ENTER停止读取;且读取完成后会丢弃末尾的换行符。
- getline()函数的全部参数为 getline(istream is,string str,结束符) , 结束符默认是换行符 ‘\n’
- 当同时使用cin>>,getline()时,需要注意的是,在cin>>读入数据完成之后,如果接下来的字符是换行符,那么在使用 getline()之前需要用getchar()把换行符吞掉,然后再使用getline()读入下一行数据。
否则,getline()会首先读入换行符,然后停止读取。由于getline()函数会丢弃数据末尾的换行符,因此最终读入的数据为空。
总结:
- getline()函数遇到换行符后停止,不但读入这个换行符,而且在读取的数据中丢弃它,这样后续的getline()读取就不用考虑这个换行符的存在了。
- cin>>x 遇到换行符之后停止读取,但是不会读入这个换行符,在接下来的读取中还要考虑到这个换行符的存在;
因此,如果接下来还是用cin读取,cin会跳过这个换行符继续下一行数据的读取,不会受影响。
但如果接下来getline()读取数据, 就需要先用getchar() 吃掉这个换行符,以免getline()读入空数据。
可以用acm模式刷题的网站:
https://exercise.acmcoder.com/online/online_judge
牛客网关于ACM模式的输入输出训练:
一些有用的内容:转载自https://blog.csdn.net/a934079371/article/details/108557562
循环输入输出处理常见问题
-
为什么需要循环输入输出:通常来说OJ对于每道题里面有.in和.out文件,分别表示测试数据的输入和输出。如果某些编程题的所有数据都只做在一个.in和一个.out中,这样就会变成多组测试了,所以需要提交的代码中循环处理。
-
处理方法:其实这个问题可以避免,就是编程题后台每个样例做一组对应的.in和.out文件,这样就变成单组测试,代码就不需要循环处理,但是平时练习的题目质量不一,这个问题都会出现。(有人在阿里笔试中遇到)
-
代码里面循环处理了即使是单组测试也会完全没问题,所以为了偷懒,可以全写成循环处理。
-
还有一个坑:如果测试数据是多组的,但是恰巧你代码里面需要些标记数组,map,set等,在循环内一定记得清空,不然可能会产生前面的测试样例影响了后续数据的答案。