2014-11-05 37 views
0

我很難讓getopt操作可選。這是我的代碼的一部分。它需要一個參數文件,如果它在那裏,它會計算字符的數量。如果不是,則計數stdinput字符。可選的getopt函數

我的問題是什麼optarg一旦它是未申報設置?我怎麼去做我的選項-c可選,並使其工作。

目前它總是從標準輸入讀取。

while((option = getopt(argc, argv, "c::")) != -1) { 
    switch(option) { 
    case 'c': 
    if (optarg == NULL) { 
     file = stdin; 
     } 
    else { 
     file = fopen(optarg, "r"); 
    } 
    while((ch = fgetc(file)) != EOF) { 
     count++; 
    } 
    printf("%d %s\n", count, optarg); 
    fclose(file); 
    break; 
+2

「什麼'optarg'設置爲一旦它是未申報」???你不可能比這更不清楚。 – 2014-11-05 08:05:28

+0

爲什麼'::',而不是':'? – alk 2014-11-05 08:17:55

+0

「兩個冒號意味着一個選項需要一個可選的參數」 - linuxmanual – Sarc 2014-11-05 08:21:55

回答

1

「Standard」(POSIX)getopt()不支持選項的可選參數。使用雙冒號"::"GNU getopt()的擴展名。

要有getopt()設置optarg一個選項的「可選」的說法使用該選項上調用這樣的程序:

program -coptional_argument_to_option_c 

但是另外,你可能想採取的下列方法之一:

  • 被人定義-c filename datory。並且如果-c filename錯過就算從stdin讀取的內容。

  • 或定義-c不帶參數告訴程序做什麼(這裏計數),並額外定義的選項告訴程序哪裏讀-f filename。如果後者錯過了stdin

+0

當文件名參數是強制性的(c :)時,getopt()自動指示該選項需要參數。那麼我在哪裏放置條件語句? – Sarc 2014-11-05 08:14:36

+0

@Sarc:哪個「*條件陳述*」? – alk 2014-11-05 08:17:03

+0

謝謝,我通過第一個選擇了它 – Sarc 2014-11-05 08:33:07

0

我發現這個在getopt的手冊頁:

兩個冒號意味着某種帶有一個可選的ARG;如果當前argv元素中有文本(即與選項名稱本身相同的單詞,例如「-oarg」),那麼它將返回optarg,否則optarg將設置爲零。

http://linux.die.net/man/3/getopt_long

本頁面還挺解釋了它好一點:

http://www.informit.com/articles/article.aspx?p=175771&seqNum=3

最後,如果在optstring的選項字母后跟兩個冒號,那麼這個選項允許有一個可選選項參數。 (說快三倍!)如果這個論點與選項在相同的argv元素中,那麼這個論點就被認爲是存在的,否則就不存在了。如果它不存在,GNU getopt()返回選項字母並將optarg設置爲NULL。例如,得到N-

while ((c = getopt(argc, argv, "ab::")) != 1) ...

- 用於-bYANKEES,返回值是 'b' 和OPTARG指向 「YANKEES」,而對於-b或 '-b YANKEES',返回值仍然是'b',但是optarg被設置爲NULL。在後一種情況下,「YANKEES」是一個單獨的命令行參數。

檢查這是否也適用於您。