2017-05-30 37 views
0

传入的全局变量我定义了一些int类型的全局变量,我希望它们与命令行参数匹配,以避免if语句带有strcmp的连续链。例如,如果我已经定义了全局变量myvar,并且用户输入myvar作为命令行参数,我希望能够引用myvar并使用argv[]对其执行操作。这可以做到吗?引用使用argv []

编辑我的问题只是为了多一点明确:

目前,我不得不这样做:

int* A; 
int* B; 
int* C; 

int set(void) 
{ 
    if (strcmp((gargv[2]), "A") == 0) 
    { 
     *A = atoi(gargv[3]); 
     return *A; 
    } 

    else if (strcmp((gargv[2]), "B") == 0) 
    { 
     *B = atoi(gargv[3]); 
     return *B; 
    } 

    else if (strcmp((gargv[2]), "C") == 0) 
    { 
     *C = atoi(gargv[3]); 
     return *C; 
    } 
    else 
    { 
     errx(EX_USAGE, "Invalid"); 
    } 
} 


int main (int argc, char** argv) 
{ 
    gargv = argv; 

    void* mem_chunk = calloc(5, sizeof(int)); 

    A = &mem_chunk[1]; 
    B = &mem_chunk[2]; 
    C = &mem_chunk[3]; 

    if (strcmp(argv[1], "set") == 0) 
    { 
     set(); 
    } 
} 

但它会少的方式繁琐,只是做这样的事情,在那里我可以设置argv[2]argv[3],它引用了全局变量A,B,或C:

int* A; 
int* B; 
int* C; 

int set(void) 
{ 
    gargv[2] = gargv[3]; 
    // example, if A and 10 given by user then set A = 10 and return 
} 

int main (int argc, char** argv) 
{ 
    gargv = argv; 

    void* mem_chunk = calloc(5, sizeof(int)); 

    A = &mem_chunk[1]; 
    B = &mem_chunk[2]; 
    C = &mem_chunk[3]; 

    if (strcmp(argv[1], "set") == 0) 
    { 
     set(); 
    } 
} 
+0

是的,使用的strcmp链 –

+0

或者使用'getopt',并根据需要通过所需要的参数和值。匹配的全局变量看起来好像是一种无所谓的方法,但我并不完全清楚你想实现的目标。 –

回答

0

你的问题是相当模糊的。当然,您可以根据传递的命令行参数设置全局变量,您可以通过首先检查/解析argv来设置所有配置变量。

这实际上是命令行程序的典型结构,参数在程序中首先被解析,然后在程序中解析,您只能使用在解析过程中设置的配置值和标志。

这并不完全清楚,但我认为你还会寻找工具来简化解析命令行参数。那么,有很多。在* nix系统上,标准库中通常有getopt()(在POSIX中指定)。请注意,该手册页还描述了仅在GNU C库(glibc)中可用的GNU扩展getopt_long()

如果getopt()是简单的你需要什么,或者你想在windows系统上使用它,看看一个老的和众所周知的命令行解析库:popt。几乎所有的Google系统都可能会找到popt实现。

然后总是有可能一旦写你自己的并重新使用它自己。我有my own,因为我需要一个有状态解析的命令行界面,就像脚本语言 - 只是给你一个想法。


你的问题让我的想法,有了这样的命令行:

> yourprogram foo=nanana bar=frobnicate 

你想设置的变量foobar在程序中。这不是典型的命令行界面,它使用带有可选参数和位置参数的开关,所以getopt()不会完全符合您的要求。但它很容易编写一个解析器,因为这个小演示表明:

#include <stdio.h> 

// configuration for the parser: 
struct argvVar 
{ 
    const char *name; // the name of the variable to look for 
    const char **value; // the address of the variable to set the value 
}; 

void parseArgvVars(int argc, char **argv, const struct argvVar *vars) 
{ 
    // loop over argv: 
    for (int i = 1; i < argc; ++i) 
    { 
     // loop over configuration items: 
     const struct argvVar *var = vars; 
     while (var->name) 
     { 
      // compare variable name with current argument: 
      const char *vname = var->name; 
      const char *arg = argv[i]; 
      while (*arg && *vname) 
      { 
       // when different, try the next configured variable: 
       if (*arg != *vname) goto nextVar; 
       ++arg; 
       ++vname; 
      } 
      if (*arg == '=') 
      { 
       // when matching and the following sign is an equals sign, 
       // assign to the variable: 
       *var->value = arg + 1; 
      } 
nextVar: 
      ++var; 
     } 
    } 
} 

int main(int argc, char **argv) 
{ 
    const char *foo = 0; 
    const char *bar = 0; 
    const char *baz = 0; 

    // list of variables we want to assign from argv values: 
    const struct argvVar vars[] = { 
     {"foo", &foo}, 
     {"bar", &bar}, 
     {"baz", &baz}, 
     {0, 0} // end of list 
    }; 

    parseArgvVars(argc, argv, vars); 

    if (foo) printf("foo: %s\n", foo); 
    if (bar) printf("bar: %s\n", bar); 
    if (baz) printf("baz: %s\n", baz); 

    return 0; 
} 

试着去了解的配置结构和解析函数的一般性质的使用,这样你可以学到如何解决问题一次,并经常重复使用代码。

-1

您必须使用getopt()或strncmp()。 实施例:

strncmp(argv[index], your_string, dim);