C/C++有什麼庫可以完成命令行參數解析?
建議 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可以是一個字元,也可以是多個字元。
返回值就是找到的命令參數,它是字元串格式,通常,如果參數是數值的話,還需要和
atoi
,atof
,ssanf
等函數一起使用。如果沒有找到,返回值是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.ioclara
*9;/。;
???這你自己切分一下,放到個vector里不就得了
推薦閱讀: