计蒜客 - c 语言 - 自定义 在线oj
问题 描述
 
核心的 部分在于如果当 两个文件 相差一个 \n 如何处理
 第一眼看上去 感觉不难啊 但是 真的自己去做的时候就会发现 有点啰嗦 自己实现的
 现在呢 膜拜一下大佬的代码
 /*************************************************************************
> Author:    hug
> Problem:   自制简易 OJ
> Mail:      hug@haizeix.com
  ************************************************************************/
#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
总结一下
 可以 通过多一个控制位 , 用 || 来将 功能重复的语句连接在一起 。
查看19道真题和解析

