2017-05-30 34 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);