在命令行运行  希望是这样的 aa是可执行文件 他需要两个参数 ,bb cc 
F:\cshiyan>aa bb cc 学了一点C 想了很久也解决不了这个问题
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
#include <string.h>/* yuanxing
cmd Param1 ft1  fr1
cmd Param1 ft2  fr2
cmd Param1 ft3  fr3
cmd Param1 ft4  fr4
*/void main(int argc,char *argv[])
{ char cmd[1000] ;
char ft[1000];
    char fr[1000];
int i;
if (argc =3)
{strcpy(cmd,argv[1]);
strcpy(ft,argv[2]);
strcpy(fr,argv[3]);
printf("%d\n",argc);
printf("%s\n",cmd);
printf("%s\n",ft);
printf("%s\n",fr);
}for(i=0;i<3;i++)
{
    char ftwei[10];
    char frwei[10];
    char canshu[128];    strcpy(ft,argv[2]);
    strcpy(fr,argv[3]);   memset(ftwei,0,sizeof(ft));
   sprintf(ftwei,"%d.ptc",i);
   strcat(ft,ftwei);   memset(frwei,0,sizeof(ft));
   sprintf(frwei,"%d.ptc",i);
   strcat(fr,frwei);//jiehedaoweiba    strcpy(cmd,argv[1]);
    //printf("%s %s %s\n",cmd,ft,fr);    sprintf(canshu,"%s %s",ft,fr);
    printf("%s %s\n",cmd ,canshu);
   STARTUPINFO si={sizeof(si)};
   PROCESS_INFORMATION pi;    CreateProcess( cmd , canshu ,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi) }}

解决方案 »

  1.   

    如果命令行中类似下面的情况
    c:\aaa aaa\bbbb.exe  
    那么就两端加
    "c:\aaa aaa\bbbb.exe" aaa "bbb cccc"aaa 是一个参数,
    bbb cccc 是一个参数。
      

  2.   

    STARTUPINFO si={sizeof(si)};
       PROCESS_INFORMATION pi;   CreateProcess( cmd , canshu ,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)后面这三句是想调用  AA 程序执行两个参数BB CC  但是总是想不明白,不知道该如何的折腾。还想一个问题是  如何判断  这个AA 执行完毕 再执行第二次AAAA  bb0.ptc cc0.ptc
    AA  bb1.ptc cc1.ptc
    AA  bb2.ptc cc2.ptc每执行一次等做完再执行第二个
    AA  bb1.ptc cc1.ptc做完再执行
    AA  bb2.ptc cc2.ptc然后就是然后
      

  3.   

    还有一个问题就是不加 FOR 循环里面不加    strcpy(cmd,argv[1])在FOR 循环里面就没有办法打印cmd 变量想不明白
      

  4.   

    1:
    Windows系统中,几乎所有的HANDLE都可用WaitForSingleObject,WaitForSingleObjectEx,WaitForMultipleObjects,WaitForMultipleObjectsEx
    进行等待其信号量。进程结束时进程的句柄会收到这个“信号”。
    2:
    在以main为程序入口时,各个参数之间是以“空格”为分界符。
    系统启动进程后调用main之前会把参数以“空格”为分界符,解析成一个二维数组。
    main( int argc, char *argv[ ])的两个参数就是解析后的结束。
    但是Windows系统还有一个函数入口
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);
    第三个参数就是命令行(由CreateProcess传入的),但这个命令行没有做过解析,是原始的(传入时的样子)。使用时需要自己解析。
    3:
    另一个你3楼提到的问是C/C++语法问题。这个只要仔细查下就可以了。
      

  5.   

    三个建议:
    1.设置一个全局变量,bool Condition=false;
    该变量用于作为开关,如果用户输入的参数命令解析有效合法,为真,
    反之为假。
    2.独立的开个函数void GetOptions(具体参数,你自己思考);
    最好给出参数输入的内容提示。
    该函数功能是独立处理解析user输入的参数命令过程,并根据解析结果做出相应的处理。
    (可以开一个变量int count=0;每符合一个参数命令串就++,直到解析全部,都符合就将
    Condition=真,否则置为假。)
    相应处理的内容就是:
    如果用户输入的参数命令解析有效合法,Condition为真,
    反之Condition为假。
    3.主函数Main中调用GetOptions,紧接着
    if(!Condition)
    {
      printf("Bad commands!\n");
      return 0;
    }具体代码,你自己写好了,我给出的是思路。
      

  6.   

    下面给出我曾经做的一个例子bool ParameterFlag=false,IsExplanation=false;
    void GetOptions(int argc, char* argv[])
    {
    const char* CmdStr;
    int CmdCount,i,j;
    char CmdChar,F1Path[256],F2Path[256];
    memset(F1Path,0,256);
    memset(F2Path,0,256);
    int Condition=0;
    if(argc==1)
    {
    fprintf(stderr,"Usage:%s [-O Directory] [-N Directory] [-U Directory] [-C] [-S] \n", argv[0]); 
    exit(1); 
    }
    for(i=1;i<argc;++i)
    {//_access( const char *path, int mode );
    ////UpdateDb -O E:\Task\Dic_Old\jobs\schema -N  E:\Task\jobs\schema -C
    ////UpdateDb -S 
    CmdStr=argv[i];
    if(CmdStr[0]=='-') 
    {
    CmdCount = strlen(CmdStr)-1;
    if(CmdStr[1]=='S' && argc==2)
    {
    printf("-O Old Object Dictionary File Path.\n"\
       "-N New Object Dictionary File Path.\n"\
       "-U Update Database According to the Previous Two Valid Path.\n"\
       "-C Execute Program to Update Datbase.\n"\
       "-S Parameter Usage Explanation.\n");
    IsExplanation=true;
    break;
    }
    for(j=0;j<CmdCount;++j)
    {
    CmdChar=CmdStr[++j];
    switch(CmdChar) 
    {
    case 'O':
    if((i+1)<argc)
    {
    strcpy(F1Path,argv[i+1]);
    strcat(F1Path,"\\ajobs.dic");
    strcpy(F2Path,argv[i+1]);
    strcat(F2Path,"\\ajobs.txt");
    if(_access(F1Path,0)==0&& _access(F2Path,0)==0)
    {
    ++Condition;
    }
    }
    break;
    case 'N':
    if((i+1)<argc)
    {
    strcpy(F1Path,argv[i+1]);
    strcat(F1Path,"\\ajobs.dic");
    strcpy(F2Path,argv[i+1]);
    strcat(F2Path,"\\ajobs.txt");
    if(_access(F1Path,0)==0&& _access(F2Path,0)==0)
    {
    ++Condition;
    }
    }
    break;
    case 'U':
    if((i+1)<argc)
    {
    strcpy(F1Path,argv[i+1]);
    if(_access(F1Path,0)==0)
    {
    ++Condition;
    }
    }
    break;
    case 'C':
    if(Condition==3)
    {
    ParameterFlag=true;
    }
    break;
    }
    }
    }
    }
    }