转载地址:X_White
这仅仅只是单个进程的代码,比较简单(离真正的开发还有着很大的差距),代码如下:
#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\n");
return ERROR;
}
ptmp = fopen(file_name, "r");
pfile = fopen("./txt", "r");
if(NULL == ptmp || NULL == pfile) {
printf("open file failed\n");
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\n", 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\n");
return 0;
}
ret = judge("test", ftmp);
switch(ret) {
case -2:
printf("Wrong Answer\n");
break;
case -3:
printf("Runtime Error\n");
break;
default:
printf("Accept\n");
break;
}
sprintf(cmd, "rm %s", ftmp);
system(cmd);
return 0;
}
函数,用于接受可变参数列表,具体用法见 execute_cmd
判题的实现很简单,用了shell的重定向,之后判断两个文本的区别即可,最后不要忘记删除那个重定向生成的文本