2013-09-22 45 views
1

我的代碼使用getopt從命令行獲取參數。我希望能夠接受三個必需的參數,以及一個可選的第四個參數。我們稱之爲分別爲輸入A和B./main string1 string2 filename./main -n 3 string1 string2 filename你如何處理getopt失序的爭論?

我被告知可選參數不需要放在開頭,所以下面也應該可以。我們稱之爲輸入C./main string1 string2 -n 3文件名。請注意,其他3個參數必須按此順序排列。這是我遇到麻煩的部分。

目前,我的代碼如下所示:

int c; 
int n; 
while ((c = getopt(argc,argv,"n:"))!=-1) { 
    printf("Loop\n"); 
    switch (c) { 
      case 'n': 
       cvalue = optarg; 
       n = atoi(optarg); 
       break; 
      case '?': 
       break; 
      default: 
       break; 
    } 
} 

如果我輸入B,代碼工作,即雲在環路和輸入被正確分配到n。但是,如果我輸入C,它甚至不會進入循環,即它甚至不會在參數中註冊-n 3。這是預期的行爲,還是我錯過了我的代碼中的東西?我該如何解決這個問題?

回答

0

getopt()實現了「標準」命令行結構,即所有選項都出現在所有參數之前(ref)。並不是所有的Unix命令都遵循這個「標準」。如果您的命令需要偏離,您可以手動解析argv [],而不使用getopt()函數。從男人3 getopt:

If there are no more option characters, getopt() returns -1. Then 
optind is the index in argv of the first argv-element that is not an 
option.