![](/img/trans.png)
[英]Parsing command line arguments without specifying the number of arguments C++
[英]Variable number of command line arguments in C++
我有一個程序( myprogram
),該程序接受一個文件作為輸入,並創建另一個文件作為輸出。 語法為:
myprogram inputfile outputfile
看起來像這樣:
int main ( int argc, char *argv[] )
{
...
if ( argc != 3 ) {
cout<<"wrong number of arguments"<< endl; return 1;}
}
myInputFile = argv[1];
myOutputFile = argv[2];
...
}
所以這里我有argv[1]
作為輸入文件。我現在想在語法中添加一些選項。 因此,例如,我希望將myprogram -a inputfile outputfile
作為選項。 選項的數量會有所不同。
這意味着文件名將取決於參數的數量。
在代碼中最聰明的方法是什么? 我可以看到一個人只會將最后兩個參數作為文件名,然后假定在那之前的參數是選項(所以類似myInputFile = argv[argc - 1]
。這感覺不太正確,因為我結束了有很多if ... then
語句。
所以我的問題是:如何最好地處理可變數量的參數?
最常見的方法是編寫一種特殊的方法來處理命令行參數。 您給它argc
和argv
,它返回一組結構化的數據值。 例如
struct commands
{
char* InputFile;
char* OutputFile;
bool WhateverAMeans;
};
這樣,您的主循環便具有所需清單,並且不需要大量的循環。
通常,您的方法將使用for循環遍歷參數以填充命令。
另外,也可以使用幫助程序類為您完成這項工作,盡管我不建議您使用很長時間沒有做過的事情。
如果您不介意,我建議您使用一個處理所有這些問題的庫。 嘗試使用Boost.Program Options 。 它看起來可能比您預期的要復雜,但功能足夠強大。 還有很多C庫,例如getopt,popt等
看一下boost :: program_options,這是非常有用且干凈的工具。 我還使用了Poco :: OptionSet,但對我來說不是那么干凈,就像升壓一樣。 Poco和boost都需要由您自己構建,但是如果您從未使用過它們-那是很好的開始機會,它們都很棒。
如果您不想使用庫,該怎么辦:
char* myInputFile = NULL ;
char* myOutputFile = NULL ;
bool option_a = false ;
int argi = 1 ;
while ( argi < argc )
{
const char* args = argv[ argi++ ] ;
switch ( *args )
{
case '-' : /* option/switch */
if ( strcmp( args, "-a" ) == 0 )
option_a = true ;
else
{
std::cerr << "Unknow option " << args << "\n" ;
exit( 1 ) ;
}
break ;
default :
if ( myInputFile == NULL )
myInputFile = args ;
else if ( myOutputFile == NULL )
myOutputFile = args ;
else
{
std::cerr << "Unexpected argument " << args << "\n" ;
exit( 1 );
}
break ;
}
}
最后,當您處理所有參數時,您可以進行一些最終檢查,例如,測試是否設置了輸入文件和輸出文件:
if ( myInputFile == NULL )
{
std::cerr << "Input file missing!\n" ;
exit( 1 ) ;
}
...
您還可以將所有參數放入一個結構中,而不用將它們分開:
struct options_t
{
char* myInputFile ;
char* myOutputFile ;
bool option_a ;
options_t() : myInputFile(), myOutputFile(), option_a() {}
} ;
這樣,您可以將所有參數傳遞給函數,而不必一一列出。
只是一個想法...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.