OJ_Judgeエンド判定

2124 ワード

これは単一プロセスのコードにすぎず、比較的簡単です(本当の開発には大きな差があります).コードは以下の通りです.
#include <stdio.h>
#include <stdarg.h>

#define ERROR -1
#define OJ_WA -2
#define OJ_RE -3
#define OJ_AC -4
#define OJ_CE -5
#define BUFFER_SIZE 30


int execute_cmd(char* fmt, ...) {
	char cmd[BUFFER_SIZE];
	int ret = 0;
	va_list ap;

	va_start(ap, fmt);
	vsprintf(cmd, fmt, ap);
	ret = system(cmd);
	va_end(ap);
	return ret;
}

int compile(char ob_name[BUFFER_SIZE], char source_name[BUFFER_SIZE]) {
	int ret = 0;
	ret = execute_cmd("gcc -o %s %s",ob_name, source_name);      // gcc -o -O2 -Wall -lm --static -std=c99
	return ret;
}

int judge(char ob_name[BUFFER_SIZE], char file_name[BUFFER_SIZE]) {
	int ret = 0;
	char stmp[BUFFER_SIZE], stxt[BUFFER_SIZE];
	FILE* ptmp;
	FILE* pfile;
	ret = execute_cmd("./%s > %s", ob_name, file_name);
	if(ret != 0) {
		printf("shell error
"); return ERROR; } ptmp = fopen(file_name, "r"); pfile = fopen("./txt", "r"); if(NULL == ptmp || NULL == pfile) { printf("open file failed
"); return ERROR; } while(!feof(ptmp) && !feof(pfile)) { fscanf(ptmp, "%s", stmp); fscanf(pfile, "%s", stxt); if(!strcmp("Segment fault", stmp)) { return OJ_RE; } if(strcmp(stmp, stxt)) { return OJ_WA; } printf("%s %s
", stmp, stxt); } fclose(ptmp); fclose(pfile); return OJ_AC; } int main() { int ret = 0; char ftmp[BUFFER_SIZE] = "tmp"; char cmd[BUFFER_SIZE]; ret = compile("test", "test.c"); if(ret != 0) { printf("Compile Error
"); return 0; } ret = judge("test", ftmp); switch(ret) { case -2: printf("Wrong Answer
"); break; case -3: printf("Runtime Error
"); break; default: printf("Accept
"); break; } sprintf(cmd, "rm %s", ftmp); system(cmd); return 0; }

関数、可変パラメータのリストを受け入れるために使用されます.具体的な使い方はexecute_を参照してください.cmd
判題の実現は簡単で、shellのリダイレクトを使って、その後2つのテキストの違いを判断すればいいので、最後にそのリダイレクトで生成されたテキストを削除することを忘れないでください.