解析execve()的命令行

时间:2013-05-11 12:01:14

标签: c strtok

我正在编写一个程序,它需要一个命令行然后解析它,以便在输入中打印每个argv的字符串数组。

代码给我一个分段错误(核心转储)!

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

char  **parse(int position ,char *argv[]  ) ;
int main(int argc ,char *argv[])
 {

    int i=1;
    int f=argc;
    argc--;
    while( i<f) 
   {
     char commands[10];
     char **argument=parse(argc,argv);
     //parse(i ,argv ,commands ,argument) ;
     printf("the argument[ %i ] is :%s \n",i,argument[i]);

     argc-- ;
     i++;
   }
  }

char **parse(int position ,char *argv[])
 {  
   // char *commands;
    char** arguments;
    char *result ;
    char buffer [30] ;
    int count =0;

    arguments = calloc(1, sizeof (char *));

    strcpy(buffer,argv[position-1]); //copy the current argv to the buffer

    result =strtok(buffer," ");
   // strcpy(commands,result); 
    //result =strtok(buffer," ");
    while(result !=NULL )
      {

        arguments[count] =result ;
        ++count;
        arguments = realloc(arguments, sizeof (char *) * (count + 1));            
        result=strtok(NULL," ");
      }
   arguments[count] = NULL; //in order to call the execvp 



   return arguments;

  } 

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我不知道你想要达到的目的但是:

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

   for( i=1; i<argc; ++i )
   {
       printf("the argument[ %i ] is :%s \n",i,argv[i]);
   }
   return 0;
}

答案 1 :(得分:1)

您可以使用argv[][]数组访问每个参数。 argc为您提供了许多参数。这包括程序名称本身。 例如:

c:\>test.exe arg1 arg2

此处argc将为3和

argv[0]="test.exe";
argv[1]="arg1";
argv[2]="arg2";

或者,如果您想进行更多交互式命令行解析,请检查此tclap

答案 2 :(得分:0)

也许就像这样

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

char  **parse(int position , char *argv[], char *outputbuff);
int main(int argc ,char *argv[]){
    int i;
    for(i=1;i<argc;++i) {
        char commands[30];
        char **argument;
        argument=parse(i ,argv ,commands);
        {
            int j;
            for(j=0;argument[j]!=NULL;++j)
                printf("the argument[ %i ] is :%s \n", j, argument[j]);
        }
        free(argument);
    }
    return 0;
}

char **parse(int position ,char *argv[], char *commands){  
    char **arguments;
    char *result ;
    int count =0;

    arguments = calloc(1, sizeof (char *));
    strcpy(commands, argv[position]);
    result =strtok(commands," ");
    while(result !=NULL ){
        arguments[count] =result ;
        ++count;
        arguments = realloc(arguments, sizeof(char*)*(count + 1));            
        result=strtok(NULL," ");
    }
    arguments[count] = NULL;

    return arguments;
}