解析execve的命令行()

问题描述:

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

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

#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; 

    } 

谢谢你的帮忙。

我不知道你试图实现什么,但:

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; 
} 
+0

Y你永远不允许'void' main()。 – 2013-05-12 05:48:20

+0

单词。已更改.... – 2013-05-12 08:00:40

您可以访问使用argv[][]阵列的每一个参数。而argc给你的参数数量。这包括程序名称本身。 例如:

c:\>test.exe arg1 arg2 

这里argc将是3和

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

或者,如果你想要更多的互动命令行解析检查这一个tclap

+0

而'argv [3] = NULL'。 – user9876 2013-05-11 12:28:27

+0

访问argv [3]将导致段错误。 – Sanoob 2013-05-11 12:29:48

+1

请参阅C规范(例如http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1539.pdf的草稿 - 您必须支付最终版本)“5.1.2.2。 1程序启动“中说”argv [argc]应该是一个空指针“。所以'argv [3] = NULL'由标准保证。 – user9876 2013-05-11 12:57:33

也许这样

#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; 
}