簡體   English   中英

在檢查選項之前處理 getopt 中的非選項參數

[英]Dealing with non-option arguments in getopt before options are checked

我正在編寫一個程序,我想在檢查標志之前獲取非選項參數。

例如,如果參數是./a.out -a -b 50 filename

我想使用filename ,然后根據標志執行task_a()和/或task_b() filename可以是argv[]任何參數

int opt;
float value;
while ((opt = getopt(argc, argv, "ab:")) != -1)
    case 'a':
        task_a(filename);
        break;
    case 'b':
         value = atof(optarg);
         task_b(filename, value);
         break;

所以基本上我需要在我的任務中使用它之前提取filename 我該如何實施?

getopt 將按照它在命令行上找到它們的順序向您傳遞命令行參數。 這通常不是您要處理它們的順序。

相反,在執行操作之前先讓您的程序設置其選項 - 所以像(給定 #include <stdbool.h> ):

// Set the defaults
bool doTaskA = false;
book doTaskB = false;
float brightness = -1;

int opt;
float value;
while ((opt = getopt(argc, argv, "ab:")) != -1) {
    case 'a':
    doTaskA = true;
    break;
case 'b':
     doTaskB = true;
     brightness = atof(optarg);
     break;
}

filename = ....,,

if (doTaskA) {
      task_a(filename);
}

if (doTaskB) {
    task_b(filename, brightness);
}

我選擇了“brightness”這個名字作為一個有意義的屬性名稱——當然你應該選擇你自己的。 好的做法是,不要將您的變量命名為“optionA”或類似的名稱——變量名稱應該描述它們是什么,而不是具體的實現細節。

總是想象你的選項可以隨着時間的推移改變字母(現在的選項“a”可能會在六個月后變成選項“R”)——除了“getopt”參數和“case”語句之外,這種變化不應該影響任何東西。

編輯更改:我最初用“if (brightness >= 0.0)”寫了這個,但決定通常一個單獨的 doTaskB 變量是更清晰、更明確的方法,不會限制參數的可能值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM