计蒜客 - c 语言 - 自定义 在线oj

问题 描述
在这里插入图片描述

核心的 部分在于如果当 两个文件 相差一个 \n 如何处理
第一眼看上去 感觉不难啊 但是 真的自己去做的时候就会发现 有点啰嗦 自己实现的
现在呢 膜拜一下大佬的代码
/*************************************************************************

> Author:    hug

> Problem:   自制简易 OJ

> Mail:      [email protected]

************************************************************************/

#include <stdio.h>

#include “run.h”

int main()

{

const char *name_program = "./program";

const char *name_in = "./in.txt";

const char *name_out = "./out.txt";

const char *name_right = "./right.txt";

run(name_program, name_in, name_out);

FILE *fpright = fopen(name_right, "r");

FILE *fpout = fopen(name_out, "r");



// Input your code here.

char c1, c2;

int ret1, ret2;

int right_flag = 1;

while (right_flag) {

    ret1 = fscanf(fpright, "%c", &c1);

    ret2 = fscanf(fpout, "%c", &c2);

    if (ret1 == EOF || ret2 == EOF) break;

    if (c1 != c2) {

        right_flag = 0;

    }

}

if (right_flag == 1) {

    if (ret1 != EOF || ret2 != EOF) {

        if ((ret1 != EOF && c1 == '\n') ||

            (ret2 != EOF && c2 == '\n')) {

            ret1 = fscanf((ret1 != EOF ? fpright : fpout), "%c", &c1);

            right_flag = (ret1 == EOF ? 1 : 0);

        } else {

            right_flag = 0;

        }

    }

}

printf("%s", right_flag ? "Accept" : "Wrong Answer");

fclose(fpout);

fclose(fpright);

return 0;

}

有什么值得学习的地方呢
自我总结一下
第一 :

printf("%s", right_flag ? "Accept" : "Wrong Answer");

将 所有的输出用一个printf 语句来处理 通过 改变 right_flag 这个参数来 判断 输出的 是 Accept 还是 Wrong Answer

第二 :

if ((ret1 != EOF && c1 == '\n') ||

                (ret2 != EOF && c2 == '\n')) {

                ret1 = fscanf((ret1 != EOF ? fpright : fpout), "%c", &c1);

                right_flag = (ret1 == EOF ? 1 : 0);

            } 

值得学习 在什么地方呢 因为原问题里有两种情形 一个是 out 文件到达了EOF 另一种 是 right 文件到达了EOF 这两种情况下 大致一样
所以 用一个 || 连接 然后 在 用一个 三元的选择运算符来 决定从哪个文件中去 再读一个char

总结一下
可以 通过多一个控制位 , 用 || 来将 功能重复的语句连接在一起 。

猜你喜欢

转载自blog.csdn.net/weixin_39722329/article/details/83153772