Logo wfirstzhang 的博客

博客

【未完工】使用 Testlib 出数据输入和验证数据输入(WyOJ,并非典藏版)

...
wfirstzhang
2026-01-17 10:57:31
密码是111111

前言

testlib 是一款由 Mike Mirzayanov 开发的开源项目。本家在这里 -> https://github.com/MikeMirzayanov/testlib。另外,我制作了 WyOJ 复制版,在这里 -> https://oj.ryp.org.cn/blog/wfirstzhang/post/147

OI-Wiki 上对于此已经有不少介绍了,我并不觉得我能写得更好。

因为 testlib 可以保证生成的数据在不同环境上一样,我推荐大家使用它造数据。

命令行参数

通常来说,我们在 OI 中会使用如下方式声明主函数:

int main();

不过,编写 testlib 程序时,我们一般用这种方式声明:

int main(int argc, char** argv);

其中 argc 表示命令行参数的数量,argv 即为命令行参数。 argv 下标从 0 开始。

读者可以尝试使用这个程序自己探究一下 argcargv 中存在什么东西。

#include <iostream>

int main(int argc, char** argv) {
    using namespace std;
    cout << "argc = " << argc << endl;
    for(int i = 0; i < argc; i++)
        cout << argv[i] << endl; 
    return 0;
}

如果你在 Windows 中这样调用这个程序:

test.exe argv[1] argv[2] argv[3]

你应该得到这样的输出:

argc = 4
test.exe
argv[1]
argv[2]
argv[3]

另外,testlib 具有解析命令行参数的功能,使用 opt 函数。

#include "testlib.h"

int main(int argc, char** argv) {
    using namespace std;
    registerGen(argc, argv, 1);
    string filename = opt(1);
    // 下面这是不行的
    // const char* filename = opt<char*>(1);
    long long n = opt<long long>(2);
    int k = opt<int>("k");
    bool is_full_t = opt<bool>("using-fullt");
    double maxv = opt<double>("R");
    printf("Destination = %s,\n"
           "n = %lld, k = %d,\n"
           "maxv = %f\n",
           filename.c_str(), n, k, maxv);
    if (is_full_t)
        printf("Using Full T\n");
    return 0;
}

如果你这样执行此程序:

./OI_Project_main fc2.in 161 -k8 -R=154.25 --using-fullt

应该会产生这样的输出:

Destination = fc2.in,
n = 161, k = 8,
maxv = 154.250000
Using Full T

Generator(数据生成)

Validator(数据输入验证)

杂话

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。