[ACM] Codeblocks区分本地环境和评测机环境

做到烦人的模拟题的时候,经常是修复了这个bug,又产生了那个bug,所以要经常调试。

 

普通做法:

  修改源代码->编译运行->粘贴输入数据->查看结果->若有bug,回到修改源代码

经常粘贴输入数据很麻烦(写代码的时候可能复制别的,又要重新复制输入数据)。使用freopen重定向输入,从文件中获取输入数据,减少粘贴输入数据的环节。

 

重定向做法:

  在源代码文件夹里新建in.txt文件->把输入数据粘贴到in.txt->保存

  修改源代码->编译运行->查看结果->若有bug,回到修改源代码

样例代码:(输入字符串后直接输出)

#include <stdio.h>

char a[1010];

void solve(){
    while(gets(a)){
        /// 处理a
        printf("%s\n", 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\n", 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),大家都来懒吧,嘿嘿~~

posted @ 2020-08-17 12:21  Dazee  阅读(189)  评论(1编辑  收藏  举报