建議 cmdline,代碼風格是比較優美的,而且操作簡單,readme 一讀就會用。另外還是 head-only 庫,不需要額外鏈接,配置簡單。

另一個答主說的 gflags 也比較著名,個人認為學習成本略高。不過畢竟是 Google 家的,專業性沒的說。

至於自己切分成 vector& 的方案就不建議用了,自己在業務代碼里做一堆字元解析和判斷夠亂的。


cxxopts


google gflag


不太理解你說的「現多個參數連在一起使用」是什麼意思,權且貼一個我的庫吧,但願能有幫助。如果不行的話,你可以再詳細描述一下,然後github上提issues。

jingweizhanghuai/Morn?

github.com圖標

介面

char *mStringArgument(int argc,char **argv,const char *flag);

argc、argv就是main函數傳入的參數,argc是參數個數,argv是參數內容(從argv[1]開始)。

flag是要尋找的參數標誌,這裡的標誌必須以字元「-」打頭,flag可以是一個字元,也可以是多個字元。

返回值就是找到的命令參數,它是字元串格式,通常,如果參數是數值的話,還需要和atoiatofssanf等函數一起使用。

如果沒有找到,返回值是NULL。

例如:

int main(int argc,char **argv)
{
char *para = mStringArgument(argc,argv,"a");
if(para!=NULL) printf("para is %s
",para);
else printf("no para
");
}

以上面的程序為例,可見mStringArgument支持以下形式的參數:

$ test.exe -a12345
para is 12345
?
$ test.exe -a 12345
para is 12345
?
$ test.exe -a=12345
para is 12345
?
$ test.exe -a=12345 -b=6789
para is 12345
?
$ test.exe -a
para is ?

也即:以下三種形式的參數都是合法的,且三種方式等價:-a12345-a 12345-a=12345

對於最後一種,雖有參數,但未指定值的情況,將返回一個字元串,其值為「?」。

對於以下兩種情況:

$ test.exe
no para
?
$ test.exe -b=6789
no para

即①沒有參數或②雖有參數但是與給定的標誌不匹配(參數為b,指定為a),其返回值都為NULL。

對於以下情況,應在程序設計時避免出現

$ test.exe -ab=12345
para is b=12345

或許開發者的本意是參數ab的值為12345,但是對於參數解析函數來說,不能區分①參數為ab,值為12345,②參數為a,值為b=12345,這兩種情況。因此應避免使用,否則將可能出錯。

對於多個參數有相同的標誌位的,mStringArgument將循環讀取各個參數。

例如:

int main(int argc,char **argv)
{
char *para = mStringArgument(argc,argv,"a");
char *para0=para;
do{
if(para!=NULL) printf("para is %s
",para);
else {printf("no para
");break;}
para = mStringArgument(argc,argv,"a");
}while(para!=para0);
}

運行以上程序,會得到:

$ test.exe -a=12 34 5
para is 12
para is 34
para is 5
?
$ test.exe -a12 -a34 -a5
para is 12
para is 34
para is 5
?
$ test.exe -a12 -a=34 -a:5
para is 12
para is 34
para is 5

$ test.exe -a12 34 -b 67 89 -a5
para is 12
para is 34
para is 5


怎麼沒人提 boost::program_options

可以解析命令行和配置文件,用的人挺多的啊。


cli11


為何多個參數不可一起用呢?先聲明變數,getopt解析並給變數賦值,最後判斷幾個變數的值組合使用。


Qt QCommandLineParser

https://doc.qt.io/qt-5/qcommandlineparser.html?

doc.qt.io


clara


*9;/。;


???這你自己切分一下,放到個vector里不就得了


推薦閱讀:
相关文章