PTA多文件题劫持控制流AC

其实并不是严格意义上的劫持控制流。

适用于

要求你自己写头文件的题目,然后给一个测试文件main.c,文件里面引你写的头文件,底下做测试,测完输出结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "linkedlist.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "linkedlist.h"

#define JUDGE(x, c, s) {\
FILE *fp = fopen(argv[1], "a");\
if ( fp ) {\
fprintf(fp, "%s\t", s);\
if ( x ) {\
credit += c;\
fprintf(fp, "PASS %d %d\n", c, credit);\
} else {\
fprintf(fp, "FAIL 0\n");\
}\
fclose(fp);\
}\
}

怒而抢夺你的main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<stdio.h>        // 读写文件用
#include<stdlib.h> // 系统指令用
#pragma once // 考点

typedef struct {
int *content;
int size;
} Array; // 题目中要你定义的类型记得定义

Array array_create(){};
void array_free(Array* array){};

int array_size(const Array *array){};
void array_inflate(Array *array){};

int array_get(const Array *array, int index){};
void array_set(Array *array, int index, int value){};

Array array_clone(const Array *array){};
// 题目中要你实现的函数就不用实现了,直接为空

int main(int argc, char *argv[])
{ // 这里是假main函数,其实比对着给的main.c写就行
FILE *fp = fopen(argv[1], "w");
// 这里会传入文件名
fprintf(fp,
"1\n\
2\n\
3\n\
4\n\
5\n\
6\n\
7\n\
8\n\
9\n\
10\n" // 回显,要与实际给行数相同
"10\n"); // 这里就是你的分数了,范围是
// INT_MIN~题目的满分
}

#define main nothing // 把真的main函数扔掉

你将获得包括但不限于以下效果: