2011-05-24 89 views
1

我是新來編程,我想添加到一個開關,將採取選項的情況下,如-aa,-aaa,-aaaaaa等,其中除了大小寫的情況下,這三種情況中的每一種都可以提供單一功能aC開關問題

我在想......

int option = getopt (argc, argv, "abcd"); 
    switch(option){ 
    case 'a': BLAH = TRUE; 
       break; 
    case 'b': FOO = TRUE; 
       break; 
    case 'c': BAR = TRUE; 
       break; 
    case 'd': BAZ = TRUE; 
       break; 
    } 
    for(int i = 1; i<argc; i++){ 
    if (argv[i][0] == '-' && argv[i][1] == 'a' && argv[i][i+2] == 'a') 
     myOption =TRUE; 
    } 

但將這項工作? 感謝您的閱讀。

+0

我的問題是不是使用getopt(),但它是否argv [i] [i + 2] =='a'會做我想做的事 – KufNayr 2011-05-24 03:08:01

回答

1

'aaa'不是整數,不是char,也不是C語言中的任何類型。傳遞給switch語句的表達式應返回一個整數。所以,switch語句會在那裏投訴。

對於非整數比較,例如列出的那些比較,使用if-else應該是好的。

3

getopt_long(3)功能提供了命令行解析到很多程序,通常與這樣的調用:

struct option long_options[] = { 
    {"add",   0, 0, 'a'}, 
    {"binary",  0, 0, 'B'}, 
    {"base",  1, 0, 'b'}, 
... 
    {"Optimize",  1, 0, 'O'}, 
    {"preprocess",  0, 0, 'p'}, 
    {NULL, 0, 0, 0}, 
}; 


while ((c = getopt_long(argc, argv, "adf:h::rRVvI:b:BCD:NSm:qQn:XKTWkO:po:", long_options, &o)) != -1) 
{ 
    switch (c) { 
    case 0: 
     PERROR("Assert, in getopt_long handling\n"); 
     display_usage(progname); 
     exit(0); 
     break; 
    case 'a': 
     count++; 
     option = OPTION_ADD; 
     break; 
    case 'd': 
     debug++; 
     skip_read_cache = 1; 
     break; 
/* ... and so forth */ 

您可能能夠使用getopt_long(3)掃描輸入數組來尋找多個輸入(認爲addbinary等,從long_options[])映射到一個簡短的選項(aB)。

但是,如果您對自己想要完成的任務更具體,可能會有更好的機制。

+0

這就是'getopt_long(3)'而不是'getopt(3)',不是嗎?至少,在RHEL 5上,'man 3 getopt'描述了getopt(3)而不是getopt_long(3),但是我的機器上的man 3 getopt_long描述了兩者。 – 2011-05-24 03:06:47

+0

@Jonathan,這就是我得到的太快瀏覽的聯機幫助:)我只是很高興,我一次輸入正確...謝謝! – sarnold 2011-05-24 03:08:28

3

不,這可能不起作用。 C中的最佳方式(假設你使用Linux)是使用GNU C庫提供的一些getopt函數。如果您只需處理一個或兩個長期選項,則還可以使用if..else ifstrcmp()

上次我查看了BSD libc的類似功能(雖然可能有點不同)。

+0

+1簡單工具也:) – sarnold 2011-05-24 03:08:53