[英]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.