做到烦人的模拟题的时候,经常是修复了这个bug,又产生了那个bug,所以要经常调试。
普通做法:
修改源代码->编译运行->粘贴输入数据->查看结果->若有bug,回到修改源代码
经常粘贴输入数据很麻烦(写代码的时候可能复制别的,又要重新复制输入数据)。使用freopen重定向输入,从文件中获取输入数据,减少粘贴输入数据的环节。
重定向做法:
在源代码文件夹里新建in.txt文件->把输入数据粘贴到in.txt->保存
修改源代码->编译运行->查看结果->若有bug,回到修改源代码
样例代码:(输入字符串后直接输出)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> char a[1010]; void solve(){ while(gets(a)){ /// 处理a printf("%s ", a); } } int main() { freopen("in.txt", "r", stdin); //从和源代码相同目录下的in.txt中读取文本,作为输入数据 solve(); return 0; }
使用重定向交代码的时候需要把freopen注释掉,否则在评测机环境下找不到in.txt,会没有了输入,WA掉。相信刚开始使用freopen的ACMer都因此WA过吧……
(正文终于开始了)
我们可以利用宏来区分本地环境和评测机环境。
在Codeblock编译器下,操作顺序如图:
在这里输入完 ACM_LOCAL 后,点下面的OK保存。
源代码写成:
#include <stdio.h> char a[1010]; void solve(){ while(gets(a)){ /// 处理a printf("%s ", a); } } int main() { #ifdef ACM_LOCAL //判断有ACM_LOCAL才执行endif里面的代码 freopen("in.txt", "r", stdin); #endif solve(); return 0; }
本地运行时:
把源代码交到评测机上结果(使用牛客的调试功能):
最终我的版本:
#ifdef ACM_LOCAL // 本地环境,重定向 freopen("t.txt","r",stdin); #else // 评测姬环境,关同步(加速cin、cout) ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #endif
注:
我是在 https://ac.nowcoder.com/acm/contest/6885/A 试的代码
顺便说一嘴牛客的编译器:用C++14时,使用gets不能通过编译,改为gets_s也不能通过编译……如果想自己去试试,记得编译器别选C++14,其他的C++11和C都可以用gets
PS:
没想到首篇文章是这个。果然懒是第二生产力啊(第一生产力是DDL),大家都来懒吧,嘿嘿~~