输入输出的问题说大不大说小不小,关键时候知道一点小技巧能帮上大忙。
## cin、cout加速
在main函数的第一行加入:
1 | ios::sync_with_stdio(false); |
关闭cin
、cout
与输入输出流的同步,可以使其速度和printf
、scanf
等几乎一样。
## 输入
N组数据
最常用的应该是这样吧……
1 | while(N--){ |
原理是先while()
函数进行判断再自减1。如当N==1,while()
判断为真,将会执行函数体,执行前N--变为0。再下一次就不会执行了。
处理到文件尾
有的题目不指定输入多少,也没有给出结束的条件,要求处理所有数据,这时用文件尾的EOF
标记。
好像EOF
等于-1来着。
1 | while(scanf(_dates_)){ |
字符串输入
真的猛士敢于使用getchar()。
经常需要整行输入,无视空格。
1 | gets(s); |
gets由于输入时不考虑缓冲区大小,可能导致栈溢出(网络安全攻防上有一个相似的经典漏洞),因此被视为不安全,有的编辑器和编译器都会警告,vs用gets_s()
代替。一般推荐使用fgets()
代替。
fgets()
本来用于文件读取,不过定向到stdio
就是从键盘输入了。每一行输入只会读取前sizeof(s)
的内容,避免了栈溢出的危险。
注意fgets()
会读取末尾的回车,记得s[strlen(s)-1]='\0'
消掉输入的回车(如果你不需要的话)。
上面第三种用了一个巧妙的表达式,%[^\n]
可以理解为只要是非\n
就一直输入。当然也可以用其他字符表示输入结束,如%[^a]
会输入直到遇见字符a。
注意,之后的内容就丢失了,请谨慎使用。
## 输出
输出基本没啥大问题吧……看清楚题目要求就好。
字符串输出后缀技巧
字符串要输出后面的一部分没必要重新搞一个,可以用以下方式:
1 | cout << s + 2 << endl; |
这样就会从s[2]
(含)开始输出。