关闭

对C++语言中dos命令的调用及system()函数使用方法的探究

标签: c语言dos
988人阅读 评论(2) 收藏 举报
分类:

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)

这里写图片描述

你看它们的修改日期都一样。。。

这里写图片描述

每个文件夹里面都是这三个文件,当然大小和内容都不相同:

这里写图片描述

我不禁想说:编程改变命运

1
0
查看评论

C语言中system()执行cmd命令打开关闭程序

函数原型: int system(char *command); 使用该函数需要添加头文件 1.打开程序 系统自带程序可直接使用start命令 system("start iexplore.exe"); //启动ie 非系统自带程序需要加入路径 system...
  • yuanjie92
  • yuanjie92
  • 2016-11-21 13:14
  • 1934

【C语言学习笔记】调用系统命令system

调用系统命令system()头文件stdlib.h函数原型int system(char *command) Windows系统 int system(const char *string) Linux系统功能简单的讲,system函数可以调用在程序中调用系统命令。 在Windows系统中调用的...
  • u012534008
  • u012534008
  • 2017-01-18 14:40
  • 255

C语言 system函数

Windows函数windows操作系统下system () 函数详解(主要是在C语言中的应用) 函数名: system功 能: 发出一个DOS命令用 法: int system(char *command);system函数已经被收录在标准c库中,可以直接调用程序例:#include stdlib...
  • Augusdi
  • Augusdi
  • 2014-02-26 21:43
  • 30291

C语言system()函数

system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include #include #include #include int system(const char * cmdstring) {   ...
  • koches
  • koches
  • 2012-05-09 23:06
  • 35091

C++使用CreateProcess执行cmd命令(实例演示)

使用CreateProcess可以执行cmd命令,也可以执行一些可执行程序。//摘自msdn的示例代码 #include <windows.h> #include <stdio.h> #include <tchar.h> void _tmain( int argc...
  • Coding13
  • Coding13
  • 2018-01-03 14:49
  • 224

vc调用cmd命令总结

在vc中调用黑屏下的cmd命令目前知道4种方法,分别是system、WinExec,ShellExecute和CreateProcess四个命令.下面简单介绍一下 1.在VC中调用DOS命令时,可以用函数system("DOS命令"),如我们经常见的命令system("...
  • skilledprogrammer
  • skilledprogrammer
  • 2010-10-01 17:54
  • 13876

VC中调用CMD命令并获取调用结果

主要
  • wwkaven
  • wwkaven
  • 2014-06-26 14:16
  • 3296

[C++] 在程序里调用DOS命令

程序里调用DOS命令,网上一般介绍说用system()函数。但是system()函数会有黑窗口跳出来,于是想到了如下办法: //cmd is DOS command line, like "mkdir d://test"void ExeCmd(char* cmd){&#...
  • wwwsq
  • wwwsq
  • 2009-06-02 14:44
  • 2751

DOS下编译C/C++以及DOS常用命令

最近想写些简单的C,但是真心不想打开VS,卡电脑啊 亲,当你的电脑跑起来和乌龟一样的时候真的很难受的!!! 还念以前用的TurboC ,编译C其实就是找到编译文件就好了,所以以下两个步骤就可以让你直接在dos下编译C/C++,对于我们这种电脑配置跟不上时代的来说太简单方便了。 (1)找到你VS或者...
  • ylf13
  • ylf13
  • 2013-10-10 12:46
  • 1899

关于在C++中调用system函数

先看看下面的这一段程序: #include #include int main(int argc, char* argv[]) {  std::cout  std::system("pause");   ...
  • heirenheiren
  • heirenheiren
  • 2012-03-19 01:46
  • 12497
    个人资料
    • 访问:10375次
    • 积分:334
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:1篇
    • 译文:0篇
    • 评论:4条
    友情链接
    文章存档
    最新评论