最近偶尔看到群里在讨论明明DevC++下测试可以运行的程序为何CCF测出来是0分呢?
当然原因可能有很多,我们这里仅仅来讨论其中一种情况,那就是因为缺少freopen的头文件而爆0的情况,缺少头文件显然是会CE(Compile Error),连验证程序的正确性的机会都没有。
#include<iostream>
#include<string>
using namespace std;
int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
string s;
long long ans=0;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='1')ans++;
}
cout<<ans;
return 0;
}
这是从浙江赛区CSP-J选手中,随机找的因为这个原因爆0的程序(oitiku.com上测试也是CE,相信大家已经深深感受到了NOIP信息网估分的强大,打CALL)
CE的原因是缺少头文件,为何DevC++能编译通过呢?我们尝试了不同版本的G++在Linux下进行程序编译,发现G++4.8.4版本编译会缺少头文件而编译过不去,但是4.9.2以及更高的版本编译是过的去。另外我们也应该注意到到DevCpp的编译选项那边编译会帮我们自动连接了很多include文件。
的确考试时候的工具可以通过编译,到了评测就CE,而且还是g++版本的问题,的确会让人不爽。有兴趣的老师可以尝试更高版本的g++,根据CCF提供的终端运行命令行尝试对爆0同学程序的编译。
在g++ 4.8.4版本下对于freopen,可以使用的头文件有#include <bits/stdc++.h>, #include <cstdio>,#include <stdio.h>,#include<fstream>
#include <bits/stdc++.h> “万能头文件”,一劳永逸,基本上竞赛所要使用的大部分库都被囊括其中,以前我们是这样的:
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
using namespace std;
int main(){
...
return 0;
}
现在大部分同学写程序大都是这样的:
#include<bits/stdc++.h>
using namespace std;
int main(){
...
return 0;
}
如果你不使用万能头文件,那么你最好有头文件#include <cstdio>或者#include <stdio.h>
详细请看:http://www.cplusplus.com/reference/cstdio/freopen/
你想使用freopen,自然需要把它的头文件include进来。
如果你即不使用万能头文件,你又不用cstdio,好吧,其实还可以使用fstream头文件,为什么fstream也使用freopen呢?
首先参考CCF NOILinux评测标准:
然后我们查看一下gcc4.8.4中的fstream文件,发现fstream中也引用了cstdio,因此使用fstream头文件的同学也可以使用freopen。
所以理论上,凡是没有使用万能头文件bits/stdc++.h或者cstdio或者fstream的,但是使用了freopen关键字的应该都会因为CE而直接爆0。
我们对浙江省CSP-J的同学们的程序(来源:http://zhejiang.xiaoxiaotong.org/FileNotice/Detail?lnArticleID=244818)做了筛选,理论上因为freopen的头文件爆0的程序有:
./ZJ-00019/number/number.cpp
./ZJ-00019/transfer/transfer.cpp
./ZJ-00062/number/number.cpp
./ZJ-00125/number/number.cpp
./ZJ-00125/transfer/transfer.cpp
./ZJ-00145/CSP-J/number/number.cpp
./ZJ-00145/CSP-J/souvenir/souvenir.cpp
./ZJ-00145/CSP-J/transfer/transfer.cpp
./ZJ-00145/CSP-J/work/work.cpp
./ZJ-00153/number/number.cpp
./ZJ-00240/number/number.cpp
./ZJ-00240/souvenir/souvenir.cpp
./ZJ-00240/transfer/transfer.cpp
./ZJ-00240/work/work.cpp
./ZJ-00241/number/number.cpp
./ZJ-00241/souvenir/souvenir.cpp
./ZJ-00241/transfer/transfer.cpp
./ZJ-00241/work/work.cpp
./ZJ-00251/number/number.cpp
./ZJ-00277/souvenir/souvenir.cpp
./ZJ-00319/number/number.cpp
./ZJ-00319/souvenir/souvenir.cpp
./ZJ-00319/work/work.cpp
./ZJ-00340/number/number.cpp
./ZJ-00340/souvenir/souvenir.cpp
./ZJ-00340/transfer/transfer.cpp
./ZJ-00340/work/work.cpp
./ZJ-00362/number/number.cpp
./ZJ-00362/souvenir/souvenir.cpp
./ZJ-00362/transfer/transfer.cpp
./ZJ-00362/work/work.cpp
./ZJ-00428/number/number.cpp
./ZJ-00428/souvenir/souvenir.cpp
./ZJ-00428/transfer/transfer.cpp
./ZJ-00428/work/work.cpp
./ZJ-00444/number/number.cpp
./ZJ-00444/souvenir/souvenir.cpp
./ZJ-00444/transfer/transfer.cpp
./ZJ-00444/work/work.cpp
./ZJ-00448/number/number.cpp
./ZJ-00460/souvenir/souvenir.cpp
./ZJ-00460/work/work.cpp
./ZJ-00461/number/number.cpp
./ZJ-00461/souvenir/souvenir.cpp
./ZJ-00461/transfer/transfer.cpp
./ZJ-00461/work/work.cpp
./ZJ-00500/number/number.cpp
./ZJ-00500/transfer/transfer.cpp
./ZJ-00500/work/work.cpp
./ZJ-00504/number/number.cpp
./ZJ-00504/souvenir/souvenir.cpp
./ZJ-00504/transfer/transfer.cpp
./ZJ-00504/work/work.cpp
./ZJ-00507/number/number.cpp
./ZJ-00507/souvenir/souvenir.cpp
./ZJ-00507/transfer/transfer.cpp
./ZJ-00512/number/number.cpp
./ZJ-00551/number/number.cpp
./ZJ-00551/souvenir/souvenir.cpp
./ZJ-00551/transfer/transfer.cpp
./ZJ-00551/work/work.cpp
./ZJ-00566/number/number.cpp
./ZJ-00566/souvenir/souvenir.cpp
./ZJ-00566/transfer/transfer.cpp
./ZJ-00572/number/number.cpp
./ZJ-00582/number/number.cpp
./ZJ-00582/transfer/transfer.cpp
./ZJ-00585/number/number.cpp
./ZJ-00585/souvenir/souvenir.cpp
./ZJ-00585/transfer/transfer.cpp
./ZJ-00585/work/work.cpp
./ZJ-00616/number/number.cpp
./ZJ-00616/souvenir/souvenir.cpp
./ZJ-00616/transfer/transfer.cpp
./ZJ-00616/work/work.cpp
./ZJ-00649/number/number.cpp
./ZJ-00649/transfer/transfer.cpp
./ZJ-00649/work/work.cpp
./ZJ-00650/number/number.cpp
./ZJ-00727/number/number.cpp
./ZJ-00727/souvenir/souvenir.cpp
./ZJ-00727/transfer/transfer.cpp
./ZJ-00737/number/number.cpp
./ZJ-00737/souvenir/souvenir.cpp
./ZJ-00737/transfer/transfer.cpp
./ZJ-00737/work/work.cpp
./ZJ-00774/number/number.cpp
./ZJ-00783/souvenir/souvenir.cpp
./ZJ-00816/souvenir/souvenir.cpp
./ZJ-00831/number/number.cpp
./ZJ-00831/transfer/transfer.cpp
./ZJ-00863/number/number.cpp
./ZJ-00912/number/number.cpp
./ZJ-00912/souvenir/souvenir.cpp
./ZJ-00916/number/number.cpp
./ZJ-00916/souvenir/souvenir.cpp
./ZJ-00916/transfer/transfer.cpp
./ZJ-00949/transfer/transfer.cpp
./ZJ-00964/number/number.cpp
./ZJ-00964/transfer/transfer.cpp
./ZJ-01064/number/number.cpp
./ZJ-01064/souvenir/souvenir.cpp
./ZJ-01064/transfer/transfer.cpp
./ZJ-01064/work/work.cpp
./ZJ-01075/ZJ-01075/number/number.cpp
./ZJ-01075/number/number.cpp
./ZJ-01125/number/number.cpp
./ZJ-01125/souvenir/souvenir.cpp
./ZJ-01125/transfer/transfer.cpp
./ZJ-01125/work/work.cpp
./ZJ-01143/number/number.cpp
./ZJ-01143/souvenir/souvenir.cpp
./ZJ-01143/work/work.cpp
作为优秀参赛省份的浙江省尚且有同学因此爆0,其他省份可能也会有类似情况发生。CSP-S组的同学相对经验丰富,总的来说这样的错误应该不会犯。
我们深表遗憾的同时,也希望后来者不要再犯这样低级的错误。