输入输出的问题说大不大说小不小,关键时候知道一点小技巧能帮上大忙。

## cin、cout加速

 在main函数的第一行加入:

1
ios::sync_with_stdio(false);

 关闭cincout与输入输出流的同步,可以使其速度和printfscanf等几乎一样。

## 输入

N组数据

 最常用的应该是这样吧……

1
2
3
while(N--){
……
}

 原理是先while()函数进行判断再自减1。如当N==1,while()判断为真,将会执行函数体,执行前N--变为0。再下一次就不会执行了。

处理到文件尾

 有的题目不指定输入多少,也没有给出结束的条件,要求处理所有数据,这时用文件尾的EOF标记。
 好像EOF等于-1来着。

1
2
3
4
5
6
7
8
while(scanf(_dates_)){
……
}

while(scanf(_dates_) != EOF){
……
}
cin同理

字符串输入

真的猛士敢于使用getchar()。

 经常需要整行输入,无视空格。

1
2
3
4
5
gets(s);

fgets(s,sizeof(s),stdin);

scanf("%[^\n]",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](含)开始输出。