C++ system()函数的使用方法探究
本篇文章实际是一篇休闲娱乐文章,大家有兴趣可以考虑如下问题(可以当做OJ题):
问题
你现在手头有一份个人代码,它十分诡异怎么也不能AC,于是你找来了一份std(标程),用它来进行对拍。当然,你很牛B,几下就把对拍的bat(批处理)文件写出来了。这时你发现dos中的fc比较一直显示无差异,但你并不知道它都测了些什么(即你不知道输入文件,因为它是随机生成的)。于是,你决定想办法把所有测试数据连同你自己与标程的输出整理到形如“dataxxx”的文件夹中。由于测试数据很多,靠人力根本不可能完成这个任务。聪明的你一定能想出解决的办法!
输入
无输入
输出
无输出
题目说明
最好结合实际经历,编写一份C++程序,它可以控制随机数据的生成,还可以用这份数据进行测试,最后将它自己的测试文件连同两个输出文件按顺序整理到文件夹(子目录)“dataxxx”中,如“data1”,“data23”中。可以使用freopen(),system()等函数,它们都在库 < cstdlib >之中。
来源
当然,这题是我现场想的,就是生活中的一个实际应用。比如本人在OJ上做题时,有时会莫名其妙地被卡(就是明明对了却就是不让我过,哼),我对拍时闲得无聊想看它都测了啥,于是我就写出了一份控制程序。
下面贴上一份代码,因为我太弱了,所以比较时采用的是文件按位比较,且没比较长度。我对于输出“dataxxx”的解决方法是先写好dos命令的前半部分,然后在后面将数字拼接上(使用< cstring >库中的strcat()和strcpy()),细节可参考代码
代码
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define maxn 505
using namespace std;
char cmp[maxn];int cnt=0;
char cmd[maxn];int con=0;
char s1[maxn]="md .\\data";//斜线要打成双斜线
char s2[maxn]="copy data.in .\\data";
char s3[maxn]="copy my.out .\\data";
char s4[maxn]="copy std.out .\\data";
char l1[maxn]="md .\\data";
char l2[maxn]="copy data.in .\\data";
char l3[maxn]="copy my.out .\\data";
char l4[maxn]="copy std.out .\\data";//字符串的大小要够,否则会导致字符串拼接不成功,而且三个文件需要分开copy,否则会被强大地合并为一个文件,有兴趣可以自己试一试
char c1[2];
void EXE(){
strcpy(l1,s1);
strcpy(l2,s2);
strcpy(l3,s3);
strcpy(l4,s4);//将原模板复制到l1,l2,l3,l4中以备后续使用
int k[10];
int m=con;
int size=0;
while(m>0){
k[size++]=m%10;
m=m/10;
}
for(int i=size-1;i>=0;i--){
c1[0]=k[i]+'0';
strcat(l1,c1);
strcat(l2,c1);
strcat(l3,c1);
strcat(l4,c1);//字符串拼接
}
system(l1);
system(l2);
system(l3);
system(l4);//执行上面的l1,l2,l3,l4命令,先创建目录,再把三份数据分别复制到指定地点
return;
}
bool Judge(){
cnt=0;
fclose(stdout);
int a=system("cd /d F:\\Someplace");//将当前路径引到当前代码的所在位置
int b=system("Test.exe < data.in > std.out");
int c=system("code2.exe < data.in > my.out");//这两句用于输入测试数据,取得输出文件
freopen("std.out","r",stdin);
while(scanf("%c",&cmp[cnt++])==1);
freopen("my.out","r",stdin);
int i=0;char ch;
while(scanf("%c",&ch)==1){
if(ch!=cmp[i++]){
EXE();
return false;
}
}
EXE();
return true;
}
int main(){
freopen("data.in","w",stdout);
srand(time(NULL));
int A,B;
do{
freopen("data.in","w",stdout);//各种重定向
do{
A=rand()%2000000000+1;
B=rand()%2000000000+1;
}while(A>B);
printf("%d %d",A,B);//这里就是生成测试数据的地方
con++;
}while(Judge()&&con<100);//这里即将执行对拍程序
return 0;
}
这份代码兼职生成测试数据,其中Test.cpp为标程,code2.cpp为个人代码(不要问我名字为什么这么怪),同时字符串内的“\”要打成“\”才对。程序可以加以改动,直接运行即可(可能速度稍微慢一些,一分钟只能生成1000+个文件夹)
总结
当然本人也是非常的弱啦,肯定会有一堆dos大神或linux终端大神在默默地bs我。。。欢迎各位留言,评论,共同交流O(∩_∩)O~ 。哦,对了,下面贴上效果图(上面指定了con大小不超过100)
你看它们的修改日期都一样。。。
每个文件夹里面都是这三个文件,当然大小和内容都不相同:
我不禁想说:编程改变命运